當我使用ObjectInputStream讀入與程序中當前定義的序列化對象不兼容時會發生什麼? 我得到一個異常或完全損壞的數據?當您反序列化不兼容的版本時會發生什麼
編譯新版本時,如果我更新serialVersionUID(根據需要),它有什麼區別嗎?
我環顧四周,似乎無法找到會發生什麼 - 只有您必須更新serialVersionUID。
當我使用ObjectInputStream讀入與程序中當前定義的序列化對象不兼容時會發生什麼? 我得到一個異常或完全損壞的數據?當您反序列化不兼容的版本時會發生什麼
編譯新版本時,如果我更新serialVersionUID(根據需要),它有什麼區別嗎?
我環顧四周,似乎無法找到會發生什麼 - 只有您必須更新serialVersionUID。
This answer總結道:
假設你有一個名爲Foo類,它有NO的serialVersionUID(默認值),而你序列化的Foo的一個實例到一個文件中。稍後,您將爲Foo類添加一些新成員。如果您嘗試從文件反序列化Foo對象,則會出現序列化失敗,說明對象不兼容。他們不兼容,這是想要你想要的,並且是默認的。它們不兼容,因爲Foo類中的新成員不能從舊的序列化Foo實例初始化。
現在,您可能會說:「我不在乎,在我的應用程序中,這些字段未初始化是可以接受的」。如果真的如此,可以將NEW Foo類的serialversionuid設置爲與OLD Foo類相同。這將告訴Java,這些對象在可串行性方面是兼容的,並且當您將舊的Foo實例反序列化到新的Foo類中(但新字段仍將未初始化)時,Java不會抱怨。
如果您是第一次創建一個新班級,並且您設置了serialversionuid,則您正在輸入合同。你在說,「對於這個班的所有未來版本,使用相同的serialversionuid,我會保證它們在狀態和序列化方面是兼容的。」
如果你改變了一個類,並且你明確地想要對舊版本進行DISALLOW反序列化,你可以將serialversionuid改爲一個新的值。如果試圖將舊對象反序列化爲新的類實例,將會引發異常。
如果隱性或顯性serialVersionUIDs不匹配,你會得到這樣一個例外:
java.io.InvalidClassException: SerialVersionUID; local class incompatible: stream classdesc serialVersionUID = 2, local class serialVersionUID = 3
如何給有使用自動定義的價值理念?由於狹窄可以改變的唯一時間是在這兩個版本之間,我真的不介意在這一點上我失去了當前狀態。這只是一個紙牌遊戲,所以如果偶爾你不能回到原來的位置,那麼它不是世界末日。 – theblitz 2011-06-02 19:26:53