幾種流行的序列化協議比較


參考:https://blog.csdn.net/baiye_xing/article/details/73249819

1、XML

(1)定義:

 

  • XML(Extensible Markup Language)是一種常用的序列化和反序列化協議, 它歷史悠久,從1998年的1.0版本被廣泛使用至今。

 

(2)優點

 

  • 人機可讀性好

 

  • 可指定元素或特性的名稱

 

(3)缺點

 

  • 序列化數據只包含數據本身以及類的結構,不包括類型標識和程序集信息。

 

  • 類必須有一個將由 XmlSerializer 序列化的默認構造函數。

 

  • 只能序列化公共屬性和字段

 

  • 不能序列化方法

 

  • 文件龐大,文件格式復雜,傳輸占帶寬

(4)使用場景

 

  • 當做配置文件存儲數據
  • 實時數據轉換

2、JSON

(1)定義:

 

  • JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式。它基於 ECMAScript (w3c制定的js規范)的一個子集, JSON采用與編程語言無關的文本格式,但是也使用了類C語言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的習慣,簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。

 

(2)優點

 

  • 前后兼容性高

 

  • 數據格式比較簡單,易於讀寫

 

  • 序列化后數據較小,可擴展性好,兼容性好

 

  • 與XML相比,其協議比較簡單,解析速度比較快

 

(3)缺點

 

  • 數據的描述性比XML差

 

  • 不適合性能要求為ms級別的情況

 

  • 額外空間開銷比較大

 

(4)適用場景(可替代XML)

 

  • 跨防火牆訪問

 

  • 可調式性要求高的情況

 

  • 基於Web browser的Ajax請求

 

  • 傳輸數據量相對小,實時性要求相對低(例如秒級別)的服務

 

3、Fastjson

(1)定義

 

Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。它采用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到極致。

 

(2)優點

 

接口簡單易用

 

目前java語言中最快的json庫

 

(3)缺點

 

過於注重快,而偏離了“標准”及功能性

 

代碼質量不高,文檔不全

 

(4)適用場景

 

協議交互

 

Web輸出

 

Android客戶端

 

4、Thrift

(1)定義:

 

  • Thrift並不僅僅是序列化協議,而是一個RPC框架。它可以讓你選擇客戶端與服務端之間傳輸通信協議的類別,即文本(text)和二進制(binary)傳輸協議, 為節約帶寬,提供傳輸效率,一般情況下使用二進制類型的傳輸協議。

 

(2)優點

 

  • 序列化后的體積小, 速度快

 

  • 支持多種語言和豐富的數據類型

 

  • 對於數據字段的增刪具有較強的兼容性

 

  • 支持二進制壓縮編碼

 

(3)缺點

 

  • 使用者較少

 

  • 跨防火牆訪問時,不安全

 

  • 不具有可讀性,調試代碼時相對困難

 

  • 不能與其他傳輸層協議共同使用(例如HTTP)

 

  • 無法支持向持久層直接讀寫數據,即不適合做數據持久化序列化協議

 

(4)適用場景

 

  • 分布式系統的RPC解決方案

5、Avro

(1)定義:

 

  • Avro屬於Apache Hadoop的一個子項目。 Avro提供兩種序列化格式:JSON格式或者Binary格式。Binary格式在空間開銷和解析性能方面可以和Protobuf媲美,Avro的產生解決了JSON的冗長和沒有IDL的問題

 

(2)優點

 

  • 支持豐富的數據類型

 

  • 簡單的動態語言結合功能

 

  • 具有自我描述屬性

 

  • 提高了數據解析速度

 

  • 快速可壓縮的二進制數據形式

 

  • 可以實現遠程過程調用RPC

 

  • 支持跨編程語言實現

 

(3)缺點

 

  • 對於習慣於靜態類型語言的用戶不直觀

(4)適用場景

 

  • 在Hadoop中做Hive、Pig和MapReduce的持久化數據格式

6、Protobuf

(1)定義

 

  • protocol buffers 由谷歌開源而來,在谷歌內部久經考驗。它將數據結構以.proto文件進行描述,通過代碼生成工具可以生成對應數據結構的POJO對象和Protobuf相關的方法和屬性。

 

(2)優點

 

  • 序列化后碼流小,性能高

 

  • 結構化數據存儲格式(XML JSON等)

 

  • 通過標識字段的順序,可以實現協議的前向兼容

 

  • 結構化的文檔更容易管理和維護

 

(3)缺點

 

  • 需要依賴於工具生成代碼

 

  • 支持的語言相對較少,官方只支持Java 、C++ 、Python

 

(4)適用場景

 

  • 對性能要求高的RPC調用

 

  • 具有良好的跨防火牆的訪問屬性

 

  • 適合應用層對象的持久化

7、其它

  • protostuff 基於protobuf協議,但不需要配置proto文件,直接導包即

 

  • Jboss marshaling 可以直接序列化java類, 無須實java.io.Serializable接口

 

  • Message pack 一個高效的二進制序列化格式

 

  • Hessian 采用二進制協議的輕量級remoting onhttp工具

 

  • kryo 基於protobuf協議,只支持java語言,需要注冊(Registration),然后序列化(Output),反序列化(Input)

8、性能對比圖解

 

 

時間

這里寫圖片描述

空間

這里寫圖片描述

分析上圖知:

  • XML序列化(Xstream)無論在性能和簡潔性上比較差。

  • Thrift與Protobuf相比在時空開銷方面都有一定的劣勢。

  • Protobuf和Avro在兩方面表現都非常優越。

9、選型建議

不同的場景適用的序列化協議:

 

  • 對於公司間的系統調用,如果性能要求在100ms以上的服務,基於XML的SOAP協議是一個值得考慮的方案。

 

  • 基於Web browser的Ajax,以及Mobile app與服務端之間的通訊,JSON協議是首選。對於性能要求不太高,或者以動態類型語言為主,或者傳輸數據載荷很小的的運用場景,JSON也是非常不錯的選擇。

 

  • 對於調試環境比較惡劣的場景,采用JSON或XML能夠極大的提高調試效率,降低系統開發成本。

 

  • 當對性能和簡潔性有極高要求的場景,Protobuf,Thrift,Avro之間具有一定的競爭關系。

 

  • 對於T級別的數據的持久化應用場景,Protobuf和Avro是首要選擇。如果持久化后的數據存儲在Hadoop子項目里,Avro會是更好的選擇。

 

  • 由於Avro的設計理念偏向於動態類型語言,對於動態語言為主的應用場景,Avro是更好的選擇。

 

  • 對於持久層非Hadoop項目,以靜態類型語言為主的應用場景,Protobuf會更符合靜態類型語言工程師的開發習慣。

 

  • 如果需要提供一個完整的RPC解決方案,Thrift是一個好的選擇。

 

  • 如果序列化之后需要支持不同的傳輸層協議,或者需要跨防火牆訪問的高性能場景,Protobuf可以優先考慮。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM