Posted on 2009-01-13 11:46
Fingki.li 閱讀(17590)
評論(3) 編輯 收藏 所屬分類:
About development
當(dāng)一個類實現(xiàn)了序列化接口,有時會遇到 java.io.InvalidClassException 異常出現(xiàn):
java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822
這是序列化兼容性所致;
java通過一個名為UID(stream unique
identifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經(jīng)過計算而得,理論上是一一映射的關(guān)系,也就是唯一的。如果UID不一
樣的話,就無法實現(xiàn)反序列化了,并且將會得到InvalidClassException。
當(dāng)要人為的產(chǎn)生一個新的版本(實現(xiàn)并沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現(xiàn):
private static final long serialVersionUID=????;//(你可以編造一個UID,但不能有重復(fù))
對于上例我們可以在com.test.Test類中加入 :
private static final long serialVersionUID=7981560250804078637l;
這樣就解決了新老版本的兼容性問題。
當(dāng)然,對于序列化還有很多問題,慢慢研究吧。