碼出高效讀書筆記:Java對象序列化

Q:什麼是序列化?

A:內存中的數據對象只有轉換爲二進制流才能進行數據持久化和網絡傳輸。將數據對象轉換成二進制流的過程被稱爲對象的序列化(Serialization)。反之,將二進制流恢復爲數據對象的過程稱爲反序列化(Deserialization)

常見的序列化方式有以下三種:

(1)Java原生序列化。Java類通過實現Serialization接口來實現該類對象的序列化,這個接口非常特殊,沒有任何辦法,只起標識作用。Java序列化保留了對象類的元數據(如類、成員變量、繼承類信息等),以及對象數據等。兼容性最好,但不支持跨語言,而且性能一般

實現Serialization接口的類建議設置serialVersionUID字段值,如果不設置,那麼每次運行時,編譯器會根據類的內部實現,包括類名,接口名、方法和屬性等來自動生成serialVersionUID。如果類的源代碼有修改,那麼重新編譯後serialVersionUID的取值可能會發生變化。因此實現Serialization接口的類一定要顯式地定義serialVersionUID屬性值。修改類時需要根據兼容性決定是否修改serialVersionUID值:

  • 如果是兼容升級,請不要修改serialVersionUID字段,避免反序列化失敗。
  • 如果是不兼容升級,需要修改serialVersionUID值,避免反序列化失敗。

不推薦使用Java原生序列化!!!

(2)Hessian序列化。Hessian序列化是一種支持動態類型、跨語言、基於對象傳輸的網絡協議。Java對象序列化的二進制流可以被其他語言(如C++、Python)反序列化。Hessian協議具有如下特性:

  • 子描述序列化類型。不依賴外部描述文件或接口定義,用一個字節表示常用基礎類型,極大縮短二進制流。
  • 語言無關,支持腳本語言。
  • 協議簡單,比Java原生序列化高效。

​​​​​​​Hessian會把複雜對象所有屬性存儲在一個Map中進行序列化。所以在父類、子類存在同名成員變量時,它會先序列化子類,再序列化父類,因此反序列化結果會導致子類同名成員變量被父類的值覆蓋。

(3)JSON序列化。JSON是一種輕量級的數據交換格式。JSON序列化就是將數據對象轉換爲JSON字符串。在序列化過程中拋棄了類型信息,所以反序列化時只有提供類型信息才能準確地反序列化。相比前兩種方式,JSON可讀性比較好,方便調試。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章