我有一個公共類,它實現(xiàn)Serializable,并由其他多個類擴展。只有那些子類曾經(jīng)被序列化過-從來沒有超類。超類已定義了serialVersionUID。我不確定是否重要,但是它沒有標記為私有,而是僅具有默認保護-您可能會說它是受軟件包保護的static final long serialVersionUID = -7588980448693010399L;但是,超類或任何子類均未實現(xiàn)readObject或writeObject,并且這些子類均未明確定義serialVersionUID。我認為在超類中定義一個就足夠了。盡管如此,就可以讀回以前序列化的對象,直到在超類中添加了新的實例變量List / ArrayList以及新方法,并且在其子類之一中添加了一些私有實例變量后,一切都還不錯。 。現(xiàn)在,當嘗試回讀先前序列化的對象時,將引發(fā)異常。與此類似的一個:com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196我假設這是由于默認的serialVersionUID(由于我未在任何子類中聲明一個)而使用的,現(xiàn)在由于超類和一個子類的更改而發(fā)生了更改。關于如何擺脫這一困境的建議將不勝感激。我假設我需要實現(xiàn)readObject和writeObject,但是除了調用defaultReadObject()和defaultWriteObject()之外,我不確定自己需要做什么。我也不知道是否需要向所有子類添加serialVerisonUID,或者每個子類是否都需要實現(xiàn)readObject和writeObject,或者假設只需要在超類中實現(xiàn)一次,便可以只實現(xiàn)一次。
3 回答

jeck貓
TA貢獻1909條經(jīng)驗 獲得超7個贊
很好地解釋了serialVersionUID,但沒有解決方案。解決方法是:serialver在所有舊類上運行該程序。將這些serialVersionUID值放在當前的類版本中。只要當前的類與舊版本在串行上兼容,就可以了。(注意以后的代碼:所有類上都應始終有一個)serialVersionUID Serializable
如果新版本與序列不兼容,那么您需要對自定義readObject實現(xiàn)進行一些魔術處理(僅writeObject在嘗試編寫與舊代碼兼容的新類數(shù)據(jù)時才需要自定義)。一般來說,添加或刪除類字段不會使類序列不兼容。更改現(xiàn)有字段的類型通常會。
當然,即使新類是串行兼容的,您仍可能需要自定義readObject實現(xiàn)。如果要填寫從舊版本的類中保存的數(shù)據(jù)中缺少的任何新字段,則可能需要這樣做(例如,您有一個新的List字段,在加載舊的類數(shù)據(jù)時,您希望將其初始化為一個空列表)。
添加回答
舉報
0/150
提交
取消