參考: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可以優先考慮。