序列化和反序列化
序列化
- 序列化是一種用來處理對象流的機制—即把對象轉換爲字節序列的過程
反序列化
- 把字節序列恢復爲對象的過程稱爲對象的反序列化
主要用途
- 對象的字節序列可永久地保存到硬盤上,通常存放在文件當中
- 在網絡上傳輸對象的字節序列
序列化的意義
- 持久化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設計理念偏於動態類型語言