2009-10-22 60 views
1

我有下面的代码到我的数据序列化到一个文件:Java序列化问题

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(); 

什么是错的二进制格式?

更新

好吧,我现在得到这样的:组块是在课堂上,其他类与其他类等复杂类。在某些时候,包含的类被声明为Object,并且应该是Serializable。正如史蒂夫所说。

谢谢你的回答。

+0

请发布** Chunk **类的代码 – 2009-10-22 13:52:32

+0

'java.beans.XMLEncoder' /'XMLDecoder'是一个完全独立的机制。 – 2009-10-22 14:08:36

回答

2

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

  • 您是否声明任何字段为瞬态?这些不会被序列化
  • 嵌套对象或集合本身可能无法序列化的任何问题?
  • 在构造函数中或其他地方是否会在反序列化操作中调用默认值?
+0

反序列化不会调用构造函数。 – 2009-10-22 13:52:42

+0

是 - 正如书面所述,“或某处否则不会被称为”... – 2009-10-22 14:54:51

2

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

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

+1

我正要说:D – 2009-10-22 13:51:57

0

除了别人提到的显而易见的瞬态字段之外,另一种(不可能)的可能性是Chunk可能实现了Externalizable,但实际上并没有覆盖必要的writeExternal/readExternal方法。这也将解释为什么XMLEncoder的工作原理。