探析“Java序列化”之serialVersionUID
生活随笔
收集整理的這篇文章主要介紹了
探析“Java序列化”之serialVersionUID
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
未顯式指定serialVersionUID
當沒有顯式地定義serialVersionUID變量時,Java序列化機制會根據(jù)編譯的class自動生成一個serialVersionUID作序列化版本,它通過類名,方法名等諸多因素經(jīng)過計算而得,和類名、實例方法名、實例屬性名等有關,和靜態(tài)屬性名和值、實例屬性值無關。
這種情況下,如果class文件(類名,方法名等)沒有發(fā)生變化(增加空格,換行,增加注釋,等等),就算編譯再多次,serialVersionUID也不會變化的。但一旦變化,那么在反序列化時就會出現(xiàn)序列化版本不一致的異常InvalidCastException。
反序列化過程
首先,載入需要反序列化的byte[]數(shù)組,并解析出類名全路徑,jvm會使用URLClassLoader去找本虛擬機中是否加載過這樣類名的一個類;
如果有,計算這個類的serialVersionUID值(如果顯示聲明了就不用計算,直接用),再和byte[]數(shù)組中的serialVersionUID對比,不相同報出異常;
當相同時,根據(jù)剛剛得到的類名全路徑newInstance一個對象出來,然后使用反射將byte內容一一復制給該對象,最后返回該對象。
總結
以上是生活随笔為你收集整理的探析“Java序列化”之serialVersionUID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS 总结之原型
- 下一篇: A quick introduction