2009-10-22 86 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的工作原理。