1. 程式人生 > 其它 >序列化之serialVersionUID

序列化之serialVersionUID

serialVersionUID作用:

序列化時為了保持版本的相容性,即在版本升級時反序列化仍保持物件的唯一性。

序列化ID起著關鍵的作用,java的序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地實體類中的serialVersionUID進行比較,如果相同則認為是一致的,便可以進行反序列化,否則就會報序列化版本不一致的異常。

  • 序列化:是把物件的狀態資訊轉化為可儲存或傳輸的形式過程,也就是把物件轉化為位元組序列的過程稱為物件的序列化。
  • 反序列化:是序列化的逆向過程,把位元組陣列反序列化為物件,把位元組序列恢復為物件的過程稱為物件的反序列化。

Serializable序列化的工作機制:
序列化的時候系統會把當前類的serialVersionUID 寫入序列化的檔案中(也可能是其他中介),當反序列化的時候系統會去檢測檔案中的serialVersionUID ,看它是否和當前類的serialVersionUID 一致,如果一致就說明序列化的類的版本和當前類的版本是相同的,這個時候可以成功反序列化,否則就說明當前類和序列化的類相比發生了某些變換,比如成員變數的數量,型別可能發生了改變,這個時候就會拋異常,反序列化失敗。
serialVersionUID 生成:

預設情況下,也就是不宣告serialVersionUID 屬性情況下,系統會按當前類的成員變數計算hash值並賦值給serialVersionUID 。

宣告serialVersionUID ,可以很大程度上避免反序列化過程的失敗。比如當版本升級後,我們可能刪除了某個成員變數,也可能增加了一些新的成員變數,這個時候我們的反序列化依然能夠成功,程式依然能夠最大程度地恢復資料,相反,如果不指定serialVersionUID ,程式就會掛掉。

如果類結構發生了非常規性改變,比如修改了類名,型別等,這個時候儘管serialVersionUID 驗證通過了,但是反序列化過程

還是會失敗,因為類結構有了毀滅性的改變。