當一個類實現了序列化接口,有時會遇到 java.io.InvalidClassException 異常出現:
java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822
這是序列化兼容性所致;
java通過一個名為UID(stream unique identifier)來控制,這個UID是隱式的,它通過類名,方法名等諸多因素經過計算而得,理論上是一一映射的關系,也就是唯一的。如果UID不一樣的話,就無法實現反序列化了,并且將會得到InvalidClassException。
當要人為的產生一個新的版本(實現并沒有改動),而拋棄以前的版本的話,可以通過顯式的聲名UID來實現:
private static final long serialVersionUID=????;//(你可以編造一個UID,但不能有重復)
對于上例我們可以在com.test.Test類中加入 :
private static final long serialVersionUID=7981560250804078637l;
這樣就解決了新老版本的兼容性問題。