奈學:一起了解幾種序列化協議

奈學教育發表於2020-08-05
序列化(編碼)是將物件序列化為二進位制形式(位元組陣列),主要用於網路傳輸、資料持久化等;而反序列化(解碼)則是將從網路、磁碟等讀取的位元組陣列還原成原始物件,主要用於網路傳輸物件的解碼,以便完成遠端呼叫。
影響序列化效能的關鍵因素:序列化後的碼流大小(網路頻寬的佔用)、序列化的效能(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)
本文來源於:奈學開發者社群
如有侵權,請聯絡我刪除~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2709537/,如需轉載,請註明出處,否則將追究法律責任。

相關文章