天天看點

實作序列化接口Serialize的時候,如果不指定serialVersionUID 的值,編譯時就會出現警告,為什麼?什麼情況下需要修改serialVersionUID 的值?

什麼情況下需要修改serialVersionUID 的值?

  • 序列化運作時使用一個稱為 serialVersionUID 的版本号與每個可序列化類相關聯,該序列号在反序列化過程中用于驗證序列化對象的發送者和接收者是否為該對象加載了與序列化相容的類。如果接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本号不同,則反序列化将會導緻 InvalidClassException。可序列化類可以通過聲明名為 “serialVersionUID” 的字段(該字段必須是靜态 (static)、最終 (final) 的 long 型字段)顯式聲明其自己的 serialVersionUID
  • 如果可序列化類未顯式聲明 serialVersionUID,則序列化運作時将基于該類的各個方面計算該類的預設 serialVersionUID 值,如“Java(TM) 對象序列化規範”中所述。不過,強烈建議所有可序列化類都顯式聲明 serialVersionUID 值,原因計算預設的 serialVersionUID 對類的詳細資訊具有較高的敏感性,根據編譯器實作的不同可能千差萬别,這樣在反序列化過程中可能會導緻意外的 InvalidClassException。
  • 是以,為保證 serialVersionUID 值跨不同 java 編譯器實作的一緻性,序列化類必須聲明一個明确的 serialVersionUID 值。還強烈建議使用 private 修改器顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應用于立即聲明類 – serialVersionUID 字段作為繼承成員沒有用處。