2010-09-21 46 views
3

我有一個關於對象的序列化和反序列化問題,當類字段改變。對象的序列化和反序列化時,類字段改變

如果使用類型MyClass的

MyClass { 
    String str1; 
    LinkedList mylist = new LinkedList(); 
    String str2; 

}

一個對象被序列化到文件。

然後,我改變,其改變MyClass的定義

MyClass { 
    String str1; 
    LinkedList mylist = new LinkedList(); 
    Map myMap = new HashMap(); 

}

之後的代碼,我反序列化從文件中的對象,以使用改變代碼MyClass的對象。可以嗎?反序列化過程中會拋出異常嗎?我想重用舊對象。即我希望可以完成反序列化。所以我希望沒有拋出異常。

謝謝。

+0

[管理序列化Java對象的多個版本。](http://stackoverflow.com/questions/3678136/managing-serveral-versions-of-serialized-java-objects) – Bozho 2010-09-21 05:01:42

回答

4

沒有,相反,你會碰到很大的問題。在Joshua Bloch的Effective Java的第74條中,他注意到明智地實現了Serializable,因爲它降低了一個類的實現一旦被釋放的靈活性。

他特別指出:「如果你不做出設計自定義序列化形式的努力,而只是接受默認,序列化形式將永遠綁在類的原始內部表示。」

2

這就是爲什麼你應該有一個的serialVersionUID。這兩個版本會有所不同,你的代碼會知道它不能完成,並停止反序列化。

+0

我想重用舊的目的。即我希望可以完成反序列化。這就是我將使用相同的serialVersionUID的原因。 – Kai 2010-09-21 01:21:16

+1

它會炸燬。您可以保留該類的舊版本,並用新名稱創建新版本...然後讓新版本使用構造函數將舊類的值映射到新類... – bwawok 2010-09-21 02:07:26

2

如果您刪除對象的字段,然後舊的對象將不反序列化。這樣做的方法是始終使用相同的serialVersionUID,並且永遠不要刪除字段,只添加它們。