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