序列化(編碼)是將對象序列化為二進制形式(字節數組),主要用於網絡傳輸、數據持久化等;而反序列化(解碼)則是將從網絡、磁盤等讀取的字節數組還原成原始對象,主要用於網絡傳輸對象的解碼,以便完成遠程調用。
影響序列化性能的關鍵因素:序列化後的碼流大小(網絡帶寬的佔用)、序列化的性能(CPU資源佔用);是否支持跨語言(異構系統的對接和開發語言切換)。
Java默認提供的序列化:無法跨語言、序列化後的碼流太大、序列化的性能差
XML,優點:人機可讀性好,可指定元素或特性的名稱。缺點:序列化數據只包含數據本身以及類的結構,不包括類型標識和程序集信息;只能序列化公共屬性和字段;不能序列化方法;文件龐大,文件格式複雜,傳輸佔帶寬。適用場景:當做配置文件存儲數據,實時數據轉換。
JSON,是一種輕量級的數據交換格式,優點:兼容性高、數據格式比較簡單,易於讀寫、序列化後數據較小,可擴展性好,兼容性好、與XML相比,其協議比較簡單,解析速度比較快。缺點:數據的描述性比XML差、不適合性能要求為ms級別的情況、額外空間開銷比較大。適用場景(可替代XML):跨防火牆訪問、可調式性要求高、基於Web browser的Ajax請求、傳輸數據量相對小,實時性要求相對低(例如秒級別)的服務。
Fastjson,採用一種“假定有序快速匹配”的算法。優點:接口簡單易用、目前java語言中最快的json庫。缺點:過於注重快,而偏離了“標準”及功能性、代碼質量不高,文檔不全。適用場景:協議交互、Web輸出、Android客戶端
Thrift,不僅是序列化協議,還是一個RPC框架。優點:序列化後的體積小, 速度快、支持多種語言和豐富的數據類型、對於數據字段的增刪具有較強的兼容性、支持二進制壓縮編碼。缺點:使用者較少、跨防火牆訪問時,不安全、不具有可讀性,調試代碼時相對困難、不能與其他傳輸層協議共同使用(例如HTTP)、無法支持向持久層直接讀寫數據,即不適合做數據持久化序列化協議。適用場景:分佈式系統的RPC解決方案
Avro,Hadoop的一個子項目,解決了JSON的冗長和沒有IDL的問題。優點:支持豐富的數據類型、簡單的動態語言結合功能、具有自我描述屬性、提高了數據解析速度、快速可壓縮的二進制數據形式、可以實現遠程過程調用RPC、支持跨編程語言實現。缺點:對於習慣於靜態類型語言的用戶不直觀。適用場景:在Hadoop中做Hive、Pig和MapReduce的持久化數據格式。
Protobuf,將數據結構以.proto文件進行描述,通過代碼生成工具可以生成對應數據結構的POJO對象和Protobuf相關的方法和屬性。優點:序列化後碼流小,性能高、結構化數據存儲格式(XML JSON等)、通過標識字段的順序,可以實現協議的前向兼容、結構化的文檔更容易管理和維護。缺點:需要依賴於工具生成代碼、支持的語言相對較少,官方只支持Java 、C++ 、python。適用場景:對性能要求高的RPC調用、具有良好的跨防火牆的訪問屬性、適合應用層對象的持久化
其它
protostuff 基於protobuf協議,但不需要配置proto文件,直接導包即可
Jboss marshaling 可以直接序列化java類, 無須實java.io.Serializable接口
Message pack 一個高效的二進制序列化格式
Hessian 採用二進制協議的輕量級remoting onhttp工具
kryo 基於protobuf協議,只支持java語言,需要註冊(Registration),然後序列化(Output),反序列化(Input)
本文來源於:奈學開發者社區
如有侵權,請聯繫我刪除~