實體類實現序列化引起的問題
阿新 • • 發佈:2019-01-22
今天啟動專案遇到一個問題java.io.InvalidClassException:某個實體類local class incompatible: stream classdesc serialVersionUID=??
這是當一個類實現了序列化介面,有時會遇到 java.io.InvalidClassException 異常出現:
-8334405535174160822
這是序列化相容性所致;
java通過一個名為UID(stream uniqueidentifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經過計算而得,理論上是一一對映的關係,也就是唯一的。如果UID不一樣的話,就無法實現反序列化了,並且將會得到InvalidClassException。
當要人為的產生一個新的版本(實現並沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現:
private static final long serialVersionUID=????;//(你可以編造一個UID,但不能有重複)
對於上例我們可以在com.test.Test類中加入 :
private static final long serialVersionUID=7981560250804078637l;
這樣就解決了新老版本的相容性問題。
當然,對於序列化還有很多問題,慢慢研究吧。 如果你能掌控類之間的差異,就讓
private static final long serialVersionUID=-1
就行的,省得讓 Java 自己生成,或者用命令 serialver.exe 來生成 serialVersionUID (參考百度)
這是當一個類實現了序列化介面,有時會遇到 java.io.InvalidClassException 異常出現:
-8334405535174160822
這是序列化相容性所致;
java通過一個名為UID(stream uniqueidentifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經過計算而得,理論上是一一對映的關係,也就是唯一的。如果UID不一樣的話,就無法實現反序列化了,並且將會得到InvalidClassException。
當要人為的產生一個新的版本(實現並沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現:
private static final long serialVersionUID=????;//(你可以編造一個UID,但不能有重複)
對於上例我們可以在com.test.Test類中加入 :
private static final long serialVersionUID=7981560250804078637l;
這樣就解決了新老版本的相容性問題。
當然,對於序列化還有很多問題,慢慢研究吧。 如果你能掌控類之間的差異,就讓
private static final long serialVersionUID=-1
就行的,省得讓 Java 自己生成,或者用命令 serialver.exe 來生成 serialVersionUID (參考百度)