2011-08-02 24 views
3

從2004年開始,我已經有了一個Serializable類,該類已在生產中使用。但是,編寫它的人忘記了生成serialVersionUID將SerialVersionUID添加到已被使用的可序列化類中

事情排序作品(有一個很大的評論警告,在班上不碰任何東西),但在不同的相關工作類,而我有一個InvalidCastException,所以我要添加serialVersionUID可以肯定的整該班正常工作。

問題是,是否有可能添加這樣一個字段,而不存在序列化實例中斷?它們中有很多,並且沒有簡單的方法來修改它們。

我的想法來自看到異常消息,這是沿着線的東西:我一直以爲我可以使用隱式串行(流classdesc在跟蹤)作爲串行

java.io.InvalidClassException: the.problematic.Class; local class incompatible: stream classdesc serialVersionUID = -8802277085918151566, local class serialVersionUID = -3137213695071887162" 

,它應該保持向後兼容性。它是否正確?我(或多或少)確定我們在系統中獲得的所有序列化實例都是相同的版本。

回答

5

是的,爲serialVersionUID指定完全相同的值,因爲按is計算應該防止向後兼容(例如Eclipse有一個選項可以做到這一點,稱爲「添加生成的序列版本ID」)。

+0

我明白了,我不確定這個id的計算方式是在jdk版本中定義和保持不變的 –

1

如果您檢查從序列化流中讀取的serialVersionUID(簡單:只需更改對象並將其讀入,異常會告訴您期望的值),您必須小心謹慎,您可以將其放入代碼中它將與這個特定的環境一起工作。然而,在其他平臺上的另一個JDK(例如IBM vs. SUN)可能具有不兼容的不同serialVersionUID。 (最糟糕的情況是,您需要從支持的VM的已知值列表中計算serialversionuid)。

相關問題