Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的序列化机制有什么问题?_Java - Fatal编程技术网

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

Java 我的序列化机制有什么问题?,java,Java,这是在Mac OS(JDK 1.6)上运行良好的代码: 在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>(ObjectInputStr

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

在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)
[...]
java.io.StreamCorruptedException:无效的流头:3F3F0005
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
位于java.io.ObjectInputStream。(ObjectInputStream.java:280)
位于com.XXX.SerializableTest.testWorks(SerializableTest.java:26)
[...]

它是关于什么的?

ObjectInputStream
只对
ObjectOutputStream
编写的数据有效

String
getBytes()
方法不是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()); 
相反,最后一行应该是这样的,其中
编码
是一种合适的字符编码,如上所述:

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

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

ObjectInputStream
仅适用于由
ObjectOutputStream
编写的数据

String
getBytes()
方法不是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()); 
相反,最后一行应该是这样的,其中
编码
是一种合适的字符编码,如上所述:

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

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

为什么它可以在Mac OS上工作而不能在Linux上工作?我想先验证数据是否被其他工具正确序列化。因此,我唯一拥有的是来自其他地方的
String
实例。在这段代码中,我必须将
char
-s流反序列化为一个对象。。“我怎么能这样做呢?”@Vincenzo-对不起,我不明白你的意思。您正在创建自己的序列化技术吗?然后不要使用
ObjectInputStream
;这是一种特殊的格式,就像你不能使用JPG解码器来读取你自己发明的新的图像文件格式一样。@Vincenzo-好的,阅读你对另一个答案的评论,我想我可能会理解。字符串
s1
是否真的
“test”
?还是一些不可读的胡言乱语?如果是后者,请查看我答案的更新。为什么它在Mac OS上工作而在Linux上不工作?我想先验证数据是否被其他工具正确序列化。因此,我唯一拥有的是来自其他地方的
String
实例。在这段代码中,我必须将
char
-s流反序列化为一个对象。。“我怎么能这样做呢?”@Vincenzo-对不起,我不明白你的意思。您正在创建自己的序列化技术吗?然后不要使用
ObjectInputStream
;这是一种特殊的格式,就像你不能使用JPG解码器来读取你自己发明的新的图像文件格式一样。@Vincenzo-好的,阅读你对另一个答案的评论,我想我可能会理解。字符串
s1
是否真的
“test”
?还是一些不可读的胡言乱语?如果是后者,请参阅更新我的答案。