gpt4 book ai didi

java - 我的序列化机制有什么问题?

转载 作者:行者123 更新时间:2023-11-29 09:46:22 25 4
gpt4 key购买 nike

这是在 Mac OS (JDK 1.6) 上运行良好的代码:

String s1 = "test";
ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes());
String s2 = (String)(new ObjectInputStream(in).readObject());

在 linux CentOS 5.4 Java 上说:

java.io.StreamCorruptedException: invalid stream header: 3F3F0005
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at com.XXX.SerializableTest.testWorks(SerializableTest.java:26)
[...]

这是关于什么的?

最佳答案

ObjectInputStream 仅适用于 ObjectOutputStream 写入的数据。

StringgetBytes() 方法不是Java 序列化机制;它仅使用您平台的默认字符编码对字符串进行编码。


使用无参数的 getBytes() 方法对大多数应用程序来说不是一个好主意。正如我所说,它使用其运行平台的默认编码。如果结果将在不同的机器上使用,它很可能会崩溃。

对于大多数应用程序,您应该明确指定要使用的字符编码。

请务必记住,某些字节序列在某些字符编码中是无效的。如果您想将任意字节序列转换为字符串,请选择一种为每个字节值分配一个字符的编码(如果有这样的话;我熟悉的常见字符不会使用每个字节) .

我猜,有问题的字符串不是 "test",而是像这样创建的:

ByteArrayOutputStream buf = ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(buf);
oos.writeObject(x);
oos.flush();
oos.close();
/* BAD! you should specify encoding! */
String encoded = new String(buf.toByteArray());

相反,最后一行应该如下所示,其中 encoding 是合适的字符编码,如上所述:

String encoded = new String(buf.toByteArray(), encoding);

但是,更好的技术是使用专门设计用于将“二进制”数据表示为文本的编码。 Base-64得到广泛支持。 Base-85更紧凑,但没有那么广泛。您将需要第三方库来执行使用其中一种编码。 (Base-64 在 Sun [Oracle] 运行时实现,但它不是公共(public) API 的一部分。)

关于java - 我的序列化机制有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3925491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com