Java序列化问题

时间:2009-10-22 13:46:55

标签: java serialization

我有以下代码将数据序列化到文件中:

out = new ObjectOutputStream(new FileOutputStream(file));
out.writeObject(chunk);
out.flush();

我读了以下内容:

in = new ObjectInputStream(new FileInputStream(file));
Chunk chunk = (Chunk) in.readObject();

奇怪的是,当我读取数据时,所有成员都设置为默认值,我没有得到我之前写过的数据。

如果我使用XML变体,一切正常。

e = new XMLEncoder(new FileOutputStream(file));
e.writeObject(chunk);
e.flush();

e = new XMLDecoder(new FileInputStream(file));
Chunk chunk = (Chunk) e.readObject();

二进制格式有什么问题?

更新

好的,我现在得到了这个: Chunk 是一个包含类的复杂类,其他类包含其他类,依此类推。在某些时候,包含的类被声明为Object,应该是Serializable。正如史蒂夫所说。

感谢您的回答。

3 个答案:

答案 0 :(得分:2)

我可以想到在序列化期间将字段设置为默认值的唯一原因是它们被定义为transient

如果不是这样,请尝试将代码提取到一个可以重现问题的小型自包含程序。最有可能的是,当你这样做时,你会发现问题的原因,否则将其发布在这里。

答案 1 :(得分:2)

虽然我想不出一个解码器与另一个解码器的工作方式不同的好理由,但我建议发布Chunk对象的代码。需要注意的事项:

  • 您是否宣布任何田地短暂?这些不会被序列化
  • 嵌套对象或集合本身可能无法序列化的问题是什么?
  • 是否在构造函数中覆盖了默认值,或者在反序列化操作中不会调用的其他地方?

答案 2 :(得分:0)

除了其他人提到的明显的瞬态字段之外,另一个(不可否认的)可能性是Chunk可能实现Externalizable但实际上并没有覆盖必要的writeExternal / readExternal方法。这也可以解释为什么XMLEncoder有效。