爲什麼需要序列化與serialVersionUID

爲什麼需要序列化與serialVersionUID

1、序列化

§ 用途:

  • 把對象序列化成字節碼,保存到指定介質上(如磁盤等)
  • 用於網絡傳輸

被序列化的實例所屬類需要實現Serializable接口:


2、serialVersionUID

serialVersionUID適用於Java的序列化機制。

簡單來說,Java的序列化機制是**通過判斷類的serialVersionUID來驗證版本一致性的**。

在進行反序列化時,JVM會把傳來的**字節流中的serialVersionUID與本地相應實體類的serialVersionUID進行比較**,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是==InvalidCastException==。

具體的序列化過程是這樣的:序列化操作的時候系統會把當前類的serialVersionUID寫入到序列化文件中,當反序列化時系統會去檢測文件中的serialVersionUID,判斷它是否與當前類的serialVersionUID一致,如果一致就說明序列化類的版本與當前類版本是一樣的,可以反序列化成功,否則失敗。


3、爲什麼建議顯式指定serialVersionUID?

舉例說明:

假設我們有一個Person類,我們進行如下操作:

  1. 先將其序列化到本地。然後再反序列化。(正常)
  2. 我們給Person類增加一個字段後,不修改UID,這時,再反序列化。(正常)(兼容)
  3. 但如果增加字段後修改了UID,則反序列化時由於JVM監測到字節流中的serialVersionUID與當前Person類中的不同,拋出異常。

由此可知:

serialVersionUID 就是控制版本是否兼容的,若我們認爲修改的 Person 是向後兼容的,則不修改 serialVersionUID;反之,則提高 serialVersionUID的值。

​ **若不顯式定義 serialVersionUID 的值,Java 會根據類細節自動生成 serialVersionUID 的值,如果對類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會發生變化。**這樣就無法做到版本兼容了。

生成serialVersionUID在idea中有一個插件:GenerateSerialVersionUID

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章