序列化的高阶认识-serialVersionUID的作用
在IDEA中通過如下設置可以生成serializeid
字面意思上是序列化的版本號,凡是實現Serializable接口的類都有一個表示序列化版本標識符的靜態變量?
演示步驟
1. 先將user對象序列化到文件中
2. 然后修改user對象,增加serialVersionUID字段
3. 然后通過反序列化來把對象提取出來
4. 演示預期結果:提示無法反序列化
結論
Java的序列化機制是通過判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是
InvalidCastException。
從結果可以看出,文件流中的class和classpath中的class,也就是修改過后的class,不兼容了,處于安全機制考慮,程序拋出了錯誤,并且拒絕載入。從錯誤結果來看,如果沒有為指定的class配置serialVersionUID,那么java編譯器會自動給這個class進行一個摘要算法,類似于指紋算法,只要這個文件有任何改動,得到的UID就會截然不同的,可以保證在這么多類中,這個編號是唯一的。所以,由于沒有顯指定serialVersionUID,編譯器又為我們生成了一個UID,當然和前面保存在文件中的那個不會一樣了,于是就出現了2個序列化版本號不一致的錯誤。因,只要我們自己指定了serialVersionUID,就可以在序列化后,去添加一個字段,或者方法,而不會影響到后期的還原,還原后的對象照樣可以使用,而且還多了方法或者屬性可以用。
tips:?serialVersionUID有兩種顯示的生成方式:?
一是默認的1L,比如:private static final long serialVersionUID = 1L;?
二是根據類名、接口名、成員方法及屬性等來生成一個64位的哈希字段
當實現java.io.Serializable接口的類沒有顯式地定義一個serialVersionUID變量時候,Java序列化機制會根據編譯的Class自動生成一個serialVersionUID作序列化版本比較用,這種情況下,如果Class文件(類名,方法明等)沒有發生變化(增加空格,換行,增加注釋等等),就算再編譯多次,serialVersionUID也不會變化的。?
?
總結
以上是生活随笔為你收集整理的序列化的高阶认识-serialVersionUID的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 序列化的高阶认识-简单认识一下 Java
- 下一篇: 序列化的高阶认识-Transient 关