天天看點

java序列化implements Serializable最好要帶上serialVersionUID1.什麼是序列化2.為什麼序列化3.序列化怎麼做(實作Serializable接口即可)4.為什麼最好要帶上serialVersionUID

1.什麼是序列化

  • 序列化

  由于存在于記憶體中的對象都是暫時的,無法長期駐存,為了把對象的狀态保持下來,這時需要把對象寫入到磁盤或者其他媒體中,這個過程就叫做序列化。

  • 反序列化

  反序列化恰恰是序列化的反向操作,也就是說,把已存在在磁盤或者其他媒體中的對象,反序列化(讀取)到記憶體中,以便後續操作,而這個過程就叫做反序列化。

2.為什麼序列化

序列化的應用情景主要有以下情況(但不限于以下情況)

  • 1)記憶體中的對象寫入到硬碟;
  • 2)用套接字在網絡上傳送對象;
  • 3)通過RMI(Remote Method Invoke 遠端方法調用)傳輸對象;

3.序列化怎麼做(實作Serializable接口即可)

4.為什麼最好要帶上serialVersionUID

序列化運作時使用一個稱為 serialVersionUID 的版本号與每個可序列化類相關聯,該序列号在反序列化過程中用于驗證序列化對象的發送者和接收者是否為該對象加載了與序列化相容的類。計算預設的 serialVersionUID 對類的詳細資訊具有較高的敏感性,根據編譯器實作的不同可能千差萬别。如果你改了這個類,預設的serialVersionUID也會變,可以了解為這個類的hash值。如果接收者加載的該對象的類的 serialVersionUID 與對應的發送者的類的版本号不同,則反序列化将會導緻 InvalidClassException。

為保證 serialVersionUID 值跨不同 java 編譯器實作的一緻性,序列化類必須聲明一個明确的 serialVersionUID 值。還強烈建議使用 private 修改器顯示聲明 serialVersionUID(如果可能),原因是這種聲明僅應用于立即聲明類 -- serialVersionUID 字段作為繼承成員沒有用處。