日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

序列化的高阶认识-serialVersionUID的作用

發布時間:2024/4/13 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 序列化的高阶认识-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的作用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。