類似百科式的網(wǎng)站建設(shè)app推廣平臺(tái)
常見序列化協(xié)議有哪些
序列化(serialization)是將對(duì)象序列化為二進(jìn)制形式(字節(jié)數(shù)組),一般也將序列化稱為編碼(Encode),主要用于網(wǎng)絡(luò)傳輸、數(shù)據(jù)持久化等。常見的序列化協(xié)議包括以下幾種:
-
JSON(JavaScript Object Notation):
- 一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和編寫。
- 它基于JavaScript語(yǔ)言的一個(gè)子集,但是可以被多種編程語(yǔ)言使用。
- 支持復(fù)雜的數(shù)據(jù)結(jié)構(gòu),包括數(shù)組、對(duì)象、字符串、數(shù)字等。
- 前后兼容性高,數(shù)據(jù)格式簡(jiǎn)單,易于讀寫,序列化后數(shù)據(jù)較小,可擴(kuò)展性好,兼容性好。
- 相對(duì)于XML,其協(xié)議比較簡(jiǎn)單,解析速度較快。但數(shù)據(jù)的描述性比XML差,不適合性能要求為毫秒級(jí)別的情況,且額外空間開銷比較大。
- 適用于跨防火墻訪問、可調(diào)式性要求高的情況、基于Web browser的Ajax請(qǐng)求,以及傳輸數(shù)據(jù)量相對(duì)小、實(shí)時(shí)性要求相對(duì)低(例如秒級(jí)別)的服務(wù)等場(chǎng)景。
-
XML(eXtensible Markup Language):
- 一種標(biāo)記語(yǔ)言,用于描述數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容。
- 具有良好的可擴(kuò)展性和跨平臺(tái)性,可以通過DTD(Document Type Definition)或者XSD(XML Schema Definition)定義數(shù)據(jù)的結(jié)構(gòu)。
- 序列化數(shù)據(jù)只包含數(shù)據(jù)本身以及類的結(jié)構(gòu),不包括類型標(biāo)識(shí)和程序集信息。類必須有一個(gè)將由XmlSerializer序列化的默認(rèn)構(gòu)造函數(shù),且只能序列化公共屬性和字段,不能序列化方法。
- 文件龐大,文件格式復(fù)雜,傳輸占帶寬。
- 常用于做配置文件存儲(chǔ)數(shù)據(jù)、實(shí)時(shí)數(shù)據(jù)轉(zhuǎn)換等場(chǎng)景。
-
Protocol Buffers(protobuf):
- 由Google開發(fā)的一種二進(jìn)制序列化協(xié)議。
- 使用簡(jiǎn)潔的接口描述語(yǔ)言來定義數(shù)據(jù)結(jié)構(gòu),并生成相應(yīng)的代碼進(jìn)行序列化和反序列化操作。
- 具有高效的編碼和解碼速度,以及較小的數(shù)據(jù)體積。
- 序列化后碼流小,性能高,是結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式。通過標(biāo)識(shí)字段的順序,可以實(shí)現(xiàn)協(xié)議的前向兼容,結(jié)構(gòu)化的文檔更容易管理和維護(hù)。
- 需要依賴于工具生成代碼,且支持的語(yǔ)言相對(duì)較少,官方只支持Java、C++、Python。
- 適用于對(duì)性能要求高的RPC調(diào)用、具有良好的跨防火墻的訪問屬性的場(chǎng)景,也適合應(yīng)用層對(duì)象的持久化。
-
Thrift:
- 由Facebook開發(fā)的一種跨語(yǔ)言的服務(wù)框架,也包含了一種二進(jìn)制序列化協(xié)議。
- 使用IDL(Interface Description Language)來定義數(shù)據(jù)結(jié)構(gòu)和服務(wù)接口,并生成相應(yīng)的代碼進(jìn)行序列化和反序列化操作。
- 支持多種編程語(yǔ)言,并提供了高效的網(wǎng)絡(luò)通信能力。
- 序列化后的體積小、速度快,支持多種語(yǔ)言和豐富的數(shù)據(jù)類型,對(duì)于數(shù)據(jù)字段的增刪具有較強(qiáng)的兼容性,還支持二進(jìn)制壓縮編碼。
- 但使用者較少,跨防火墻訪問時(shí)不安全,不具有可讀性,調(diào)試代碼時(shí)相對(duì)困難。不能與其他傳輸層協(xié)議共同使用(例如HTTP),也無法支持向持久層直接讀寫數(shù)據(jù),即不適合做數(shù)據(jù)持久化序列化協(xié)議。
- 常用于分布式系統(tǒng)的RPC解決方案等場(chǎng)景。
-
MessagePack:
- 一種高效的二進(jìn)制序列化協(xié)議,類似于JSON。
- 將數(shù)據(jù)壓縮為二進(jìn)制格式,具有較小的數(shù)據(jù)體積和高速的編碼解碼能力。
- 支持多種編程語(yǔ)言,并且可以與JSON相互轉(zhuǎn)換。
-
Avro:
- 一種基于Schema的二進(jìn)制序列化協(xié)議,由Apache開發(fā)。
- 使用JSON來定義數(shù)據(jù)結(jié)構(gòu),并將數(shù)據(jù)編碼為緊湊的二進(jìn)制格式。
- 支持動(dòng)態(tài)類型、架構(gòu)演化和跨語(yǔ)言等特性。
- Binary格式在空間開銷和解析性能方面可以和Protobuf媲美,Avro的產(chǎn)生解決了JSON的冗長(zhǎng)和沒有IDL的問題。
- 支持豐富的數(shù)據(jù)類型,簡(jiǎn)單的動(dòng)態(tài)語(yǔ)言結(jié)合功能,具有自我描述屬性,提高了數(shù)據(jù)解析速度。其快速可壓縮的二進(jìn)制數(shù)據(jù)形式可以實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用RPC,并支持跨編程語(yǔ)言實(shí)現(xiàn)。
- 對(duì)于習(xí)慣于靜態(tài)類型語(yǔ)言的用戶可能不太直觀。
- 適用于Hadoop中做Hive、Pig和MapReduce的持久化數(shù)據(jù)格式等場(chǎng)景。Avro的設(shè)計(jì)理念偏向于動(dòng)態(tài)類型語(yǔ)言,因此對(duì)于動(dòng)態(tài)語(yǔ)言為主的應(yīng)用場(chǎng)景,Avro是更好的選擇。
-
Fastjson:
- 一個(gè)Java語(yǔ)言編寫的高性能功能完善的JSON庫(kù)。
- 采用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到極致。
- 接口簡(jiǎn)單易用,是目前Java語(yǔ)言中最快的json庫(kù)。
- 但過于注重快,而偏離了“標(biāo)準(zhǔn)”及功能性,代碼質(zhì)量不高,文檔不全。
- 適用于協(xié)議交互、Web輸出、Android客戶端等場(chǎng)景。
為什么不推薦使用 JDK 自帶的序列化
不推薦使用JDK自帶的序列化(即java.io.Serializable)的原因主要有以下幾點(diǎn):
- 不支持跨語(yǔ)言調(diào)用:
- JDK自帶的序列化方式高度依賴Java語(yǔ)言,序列化后的字節(jié)數(shù)組只能由Java語(yǔ)言反序列化,無法與其他編程語(yǔ)言(如C++、Python、Go等)進(jìn)行無縫傳輸與反序列化。這在多語(yǔ)言、多平臺(tái)交互的系統(tǒng)中會(huì)造成不便。
- 性能較差:
- JDK自帶的序列化機(jī)制在序列化和反序列化過程中會(huì)產(chǎn)生較大的字節(jié)數(shù)組,增加了存儲(chǔ)和傳輸?shù)呢?fù)擔(dān)。
- 相較于其他高效的序列化框架(如Protobuf、Thrift等),JDK自帶的序列化方式在性能上顯得較低,序列化速度相對(duì)較慢。
- 存在安全隱患:
- JDK自帶的序列化和反序列化機(jī)制容易受到反序列化攻擊。攻擊者可以通過構(gòu)造惡意輸入數(shù)據(jù),利用反序列化過程中的漏洞執(zhí)行任意代碼,造成系統(tǒng)安全漏洞。
- 為了避免這些安全問題,需要開發(fā)者在序列化和反序列化過程中進(jìn)行嚴(yán)格的校驗(yàn)和防護(hù),這增加了開發(fā)的復(fù)雜性和風(fēng)險(xiǎn)。
- 可讀性差:
- JDK自帶的序列化方式生成的字節(jié)流是二進(jìn)制數(shù)據(jù),不易閱讀和理解。這對(duì)于調(diào)試和排查問題來說是一個(gè)不利因素。
- 版本兼容性問題:
- 當(dāng)類的定義發(fā)生變化時(shí),如果沒有妥善處理序列化ID(serialVersionUID)的一致性,可能會(huì)導(dǎo)致反序列化失敗。這增加了維護(hù)和管理序列化數(shù)據(jù)的復(fù)雜性。