serialVersionUID的作用以及設定方法
serialVersionUID的作用以及設定方法
設定 serialVersionUID預設的生成方式: private static final long serialVersionUID = 1L;
serialVersionUID的作用:serialVersionUID 用來表明類的不同版本間的相容性。如果你修改了此類, 要修改此值。否則以前用老版本的類序列化的類恢復時會出錯。
在JDK中,可以利用JDK的bin目錄下的serialver.exe工具產生這個serialVersionUID,對於Test.class,執行命令:serialver Test。
為了在反序列化時,確保類版本的相容性,最好在每個要序列化的類中加入 private static final long serialVersionUID這個屬性,具體數值自己定義。這樣,即使某個類在與之對應的物件 已經序列化出去後做了修改,該物件依然可以被正確反序列化。否則,如果不顯式定義該屬性,這個屬性值將由JVM根據類的相關資訊計算,而修改後的類的計算 結果與修改前的類的計算結果往往不同,從而造成物件的反序列化因為類版本不相容而失敗。
不顯式定義這個屬性值的另一個壞處是,不利於程式在不同的JVM之間的移植。因為不同的編譯器實現該屬性值的計算策略可能不同,從而造成雖然類沒有改變,但是因為JVM不同,出現因類版本不相容而無法正確反序列化的現象出現。
簡單來說,Java的序列化機制是通過在執行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認為是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。