爲什麼需要序列化與serialVersionUID
1、序列化
§ 用途:
- 把對象序列化成字節碼,保存到指定介質上(如磁盤等)
- 用於網絡傳輸
被序列化的實例所屬類需要實現Serializable
接口:
2、serialVersionUID
serialVersionUID
適用於Java的序列化機制。
簡單來說,Java的序列化機制是**通過判斷類的serialVersionUID
來驗證版本一致性的**。
在進行反序列化時,JVM會把傳來的**字節流中的serialVersionUID
與本地相應實體類的serialVersionUID
進行比較**,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常,即是==InvalidCastException
==。
具體的序列化過程是這樣的:序列化操作的時候系統會把當前類的
serialVersionUID
寫入到序列化文件中,當反序列化時系統會去檢測文件中的serialVersionUID
,判斷它是否與當前類的serialVersionUID
一致,如果一致就說明序列化類的版本與當前類版本是一樣的,可以反序列化成功,否則失敗。
3、爲什麼建議顯式指定serialVersionUID?
舉例說明:
假設我們有一個Person類,我們進行如下操作:
- 先將其序列化到本地。然後再反序列化。(正常)
- 我們給Person類增加一個字段後,不修改UID,這時,再反序列化。(正常)(兼容)
- 但如果增加字段後修改了UID,則反序列化時由於JVM監測到字節流中的
serialVersionUID
與當前Person類中的不同,拋出異常。
由此可知:
serialVersionUID
就是控制版本是否兼容的,若我們認爲修改的 Person 是向後兼容的,則不修改 serialVersionUID;反之,則提高 serialVersionUID的值。
**若不顯式定義 serialVersionUID 的值,Java 會根據類細節自動生成 serialVersionUID 的值,如果對類的源代碼作了修改,再重新編譯,新生成的類文件的serialVersionUID的取值有可能也會發生變化。**這樣就無法做到版本兼容了。
生成serialVersionUID在idea中有一個插件:GenerateSerialVersionUID