第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java序列化-java.io.InvalidClassException本地類不兼容

Java序列化-java.io.InvalidClassException本地類不兼容

冉冉說 2019-12-27 15:19:29
我有一個公共類,它實現(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ù)時,您希望將其初始化為一個空列表)。


查看完整回答
反對 回復 2019-12-27
?
智慧大石

TA貢獻1946條經(jīng)驗 獲得超3個贊

對我來說,我忘記添加默認的序列號。


private static final long serialVersionUID = 1L;


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 522 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號