序列化的應用與深入

序列化和反序列化

序列化

  • 序列化是一種用來處理對象流的機制—即把對象轉換爲字節序列的過程

反序列化

  • 把字節序列恢復爲對象的過程稱爲對象的反序列化

主要用途

  • 對象的字節序列可永久地保存到硬盤上,通常存放在文件當中
  • 在網絡上傳輸對象的字節序列

序列化的意義

  • 持久化java對象
  • 當JVM處於運行期的時候,我們可以在Java平臺使用可複用的對象
  • 現實應用中,JVM停止運行之後希望能夠保存指定的對象,以便重新讀取
  • Java對象在進行網絡傳輸時,需要實現 Serializable 接口解決網絡傳輸問題

Java的序列化機制

  • java類通過實現serializable接口實現對序列的序列化
  • 通過輸出流ObjectOutputStream和輸入流ObjectInputStream對目標對象進行轉化
  • 凡是實現Serializable接口的類都有一個標識序列化版本的靜態變量
  • java的序列化機制通過serializableUID來驗證版本的一致性
  • 若沒有爲目標類配置serializableUID,Java編譯器會自動爲目標類進行一個摘要算法
    • 文件有任何改動,得到的UID就會截然不同

Transient關鍵字

  • transient關鍵字的作用是控制變量的序列化
  • 使用transient關鍵字修飾的變量,不會被序列化
  • 反序列化的時候,transient變量的值會被設爲初始值

繞開transient機制的方法

  • 通過writeObject和readObject兩個私有方法可以使被transient關鍵字修飾的變量正確被序列化和反序列化

Java序列化總結

  • Java序列化只針對對象的變量,不關心對象中的方法
  • 父類實現序列化接口,子類會自動實現序列化
  • 若被序列化的對象存在引用,則被引用的對象也會被序列化
  • 被transient關鍵字修飾的變量,會被序列化機制忽略

分佈式架構下常見的序列化技術

  • 隨着分佈式架構、微服務架構的普及。服務之間的通信成爲了最基本的需求。
  • 對於序列化而言,如何提升序列化的性能以及解決跨語言問題,成爲了重中之重
  • 由於Java序列化的數據比較大,傳輸效率低,不同語言難以識別和對接
  • 衍生出了各種序列化技術

XML序列化

  • 優點:XML序列化的好處在於可讀性好,方便調試
  • 缺點:序列化以後的字節碼文件比較大,而且效率不高,適用範圍小

JSON序列化框架

  • json是一種輕量級的數據交換格式
  • 相對於xml來說,json字節流更小,可讀性更好
  • 常見JSON序列化工具
    • JackJson
    • 阿里開源FastJson
    • GSON

Hessian序列化框架

  • 支持跨語言傳輸的二進制序列化協議
  • 擁有更好的性能和易用性,且支持多種不同的語言

Avro序列化

  • 數據序列化系統
  • 設計用於支持大批量數據交換的應用

kyro序列化

  • 非常成熟的序列化實現,在Hive、Storm中使用的比較廣泛,不能跨語言
  • dubbo在2.6版本已經支持了kyro序列化機制。性能由於Hession

protobuf序列化框架

  • protobuf是Google提供的一種數據交換格式,獨立於語言、獨立於平臺
  • 提供多種語言來實現,如Java、C、Go、Python
  • 純粹的表示層協議,可以和各種協議一起使用
  • 使用廣泛,空間開銷小性能更佳但是使用較爲複雜

選型建議

  • 對性能要求不高的場景,可以採用基於XML的SOAP協議
  • 對性能要求較高,Hession、Protobug、Thrift、avro都可以
  • 基於前後端分離,選用JSON較好
  • Avro設計理念偏於動態類型語言
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章