簡單來說,Java的序列化機(jī)制是通過在運(yùn)行時(shí)判斷類的serialVersionUID來驗(yàn)證版本一致性的。
在進(jìn)行反序列化時(shí),JVM會(huì)把傳來的字節(jié)流中的serialVersionUID與本地相應(yīng)實(shí)體(類)的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常。(InvalidClassException)
serialVersionUID有兩種顯示的生成方式:
一個(gè)是默認(rèn)的1L,比如:private static final long serialVersionUID = 1L;
一個(gè)是根據(jù)類名、接口名、成員方法及屬性等來生成一個(gè)64位的哈希字段,
比如:private static final long serialVersionUID = xxxxL;
當(dāng)你一個(gè)類實(shí)現(xiàn)了Serializable接口,如果沒有顯式地定義serialVersionUID,Eclipse會(huì)提供這個(gè) 提示功能告訴你去定義 。
在Eclipse中點(diǎn)擊類中warning的圖標(biāo)一下,Eclipse就會(huì) 自動(dòng)給定兩種生成的方式。
如果不想定義它,在Eclipse的設(shè)置中也 可以把它關(guān)掉的,設(shè)置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems
將Serializable class without serialVersionUID的warning改成ignore即可。
當(dāng)實(shí)現(xiàn)java.io.Serializable接口的實(shí)體(類)沒有顯式地定義一個(gè)名為serialVersionUID的long型的變量,Java序列化機(jī)制會(huì)根據(jù)編譯的class(它通過類名,方法名等諸多因素經(jīng)過計(jì)算而得,理論上是一一映射的關(guān)系,也就是唯一的)自動(dòng)生成一個(gè)serialVersionUID作序列化版本比較用,這種情況下,如果class文件(類名,方法明等)沒有發(fā)生變化(增加空格,換行,增加注釋,等等),就算再編譯多次,serialVersionUID也不會(huì)變化的.
作者:wuxinliulei
鏈接:https://www.zhihu.com/question/24852886/answer/117314768
來源:知乎