OpenHarmony啃論文成長(zhǎng)計(jì)劃---淺談序列化規(guī)范
??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
大家好! 我是來自深圳技術(shù)大學(xué)FSR實(shí)驗(yàn)室的同學(xué),標(biāo)題FFH就是FSRlab For Harmony!并且我也正在參加OpenHarmony成長(zhǎng)計(jì)劃從論文到開源提交研究,以后我們也會(huì)陸續(xù)在這個(gè)社區(qū)記錄學(xué)習(xí)心得和體會(huì)。
引言
在涉及到網(wǎng)絡(luò)遠(yuǎn)程通信的過程中,序列化傳遞的數(shù)據(jù)是不可避免的。
序列化(Serialization)其實(shí)就是將要傳遞的數(shù)據(jù)以及數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為位字符串(bit-string),而反序列化(Deserialization)就是將為位字符串重新轉(zhuǎn)換為原始數(shù)據(jù)以及相應(yīng)數(shù)據(jù)結(jié)構(gòu)。
對(duì)于序列化其實(shí)有規(guī)范分類,一種是文本及二進(jìn)制序列化規(guī)范(Textual and Binary Serialization Specififications),還有一種是無模式及模式驅(qū)動(dòng)規(guī)范(Schema-less and Schema-driven Serialization Specififications),下面我們簡(jiǎn)單了解一下這兩個(gè)規(guī)范分類。
文本及二進(jìn)制序列化規(guī)范(Textual and Binary Serialization Specififications)
如果序列化規(guī)范產(chǎn)生的位字符串對(duì)應(yīng)于文本編碼中的字符序列,如對(duì)應(yīng)ASCII、EBCDIC/CCSID 037或UTF-8,則序列化規(guī)范稱為文本序列化規(guī)范(Textual Serialization Specififications),否則序列化規(guī)范稱為二進(jìn)制序列化規(guī)范(Binary Serialization Specififications)。
下圖是用這兩種規(guī)范分別序列化3.1415926535的例子:
文本序列化規(guī)范(Textual Serialization Specififications)
我們可以將文本序列化規(guī)范視為具備特定文本編碼(如UTF-8)規(guī)則內(nèi)的一組約定。用于操作該文本編碼格式的計(jì)算機(jī)工具可以方便的處理對(duì)應(yīng)序列化后的位字符串。
比如上圖用兩種規(guī)范序列化3.1415926535。
文本表示法將十進(jìn)制數(shù)字編碼為一個(gè) 96 bit長(zhǎng)的數(shù)字字符序列 ,我序列化后的位字符串可以使用對(duì)應(yīng)的文本編輯器(比如這里是UTF-8編碼格式的編輯器)輕松地檢查和處理,可讀性較高。
二進(jìn)制序列化規(guī)范(Binary Serialization Specififications)
還是上圖用二進(jìn)制規(guī)范序列化3.1415926535。
從圖中序列化后的位字符串來看, 二進(jìn)制序列化表示法根據(jù)其符號(hào)、指數(shù)和尾數(shù)對(duì)十進(jìn)制數(shù)進(jìn)行編碼。所得到的位字符串只有 32 bit長(zhǎng)。
差異及應(yīng)用
從序列化后的數(shù)據(jù)占用的空間來看——二進(jìn)制序列化規(guī)范比文本序列化規(guī)范表示法小三倍。然而, 我們無法使用通用的基于文本的工具來處理它,二進(jìn)制序列化規(guī)范需要一個(gè)比較詳細(xì)的協(xié)議來定義被序列化后的二進(jìn)制流的每個(gè)字節(jié)的含義是什么。因?yàn)檫@個(gè)規(guī)范處理的數(shù)據(jù)空間占用比較小,因此傳輸效率比較高,但是可讀性較低,一般用于需要數(shù)據(jù)傳輸效率非常高的場(chǎng)景。
JSON,XML以及 BSON,ProtocolBuffers是常用的序列化手段,前面兩個(gè)是基于文本序列化規(guī)范的,后面兩個(gè)是基于二進(jìn)制序列化規(guī)范的。但是,無論是文本格式還是二進(jìn)制格式,存儲(chǔ)的都是二進(jìn)制。
模式驅(qū)動(dòng)及無模式序列化規(guī)范(Schema-less and Schema-driven Serialization Specififications)
如果序列化規(guī)范生成的位字符串可以在事先不了解其原始數(shù)據(jù)及其數(shù)據(jù)結(jié)構(gòu)的情況下進(jìn)行反序列化,則稱這種規(guī)范是模式序列化規(guī)范的。否則,則稱為模式驅(qū)動(dòng)序列化規(guī)范。
下圖是兩種規(guī)范分別序列化兩個(gè)哈希映射的例子:
模式驅(qū)動(dòng)序列化規(guī)范(Schema-driven Serialization Specififications)
模式驅(qū)動(dòng)序列化規(guī)范Schema-driven Serialization Specififications)的特點(diǎn)就是在我們傳遞數(shù)據(jù)的時(shí)候,我們要事先約定傳遞的數(shù)據(jù)結(jié)構(gòu)信息,并且將結(jié)構(gòu)信息編碼到序列化生成的位字符串中。
比如上圖的例子是序列化兩個(gè)映射。
{
"latitude":48858093,
"longitude":2294694
}
模式驅(qū)動(dòng)列化后位字符串的(底部)除了作為整數(shù)前綴的映射的長(zhǎng)度,省略了大多數(shù)自描述性信息。如果沒有提前約定相關(guān)的源數(shù)據(jù)結(jié)構(gòu)信息,接收者無法處理模式驅(qū)動(dòng)下的位字符串,也就是不知道如何轉(zhuǎn)換為原始數(shù)據(jù)結(jié)構(gòu)。
無模式序列化規(guī)范(Schema-less Serialization Specififications)
還是上圖的例子,無模式序列化規(guī)范(頂部)是自描述性的,原始數(shù)據(jù)結(jié)構(gòu)的信息和原始數(shù)據(jù)都用不同的屬性區(qū)別開來。所以數(shù)據(jù)接收者不需要提前約定,就可以對(duì)序列化后的位字符串進(jìn)行處理。
差異及應(yīng)用
從上面的介紹我們可以看到,模式驅(qū)動(dòng)序列化規(guī)范序列化后會(huì)產(chǎn)生的相對(duì)節(jié)省很多空間的位字符串。因此,網(wǎng)絡(luò)要求高效的系統(tǒng)傾向于采用模式驅(qū)動(dòng)的序列化規(guī)范。模式驅(qū)動(dòng)的序列化規(guī)范通常與空間效率有關(guān),因此往往是二進(jìn)制的。然而,也有人提出了一個(gè)基于文本JSON兼容的模式驅(qū)動(dòng)序列化規(guī)范。
上圖中表示的是用不同的序列化技術(shù),分別序列化相同數(shù)據(jù)后,對(duì)位字符串信息量大小進(jìn)行排序。(越往右信息量越小)。
我們可以根據(jù)上圖直觀地看到序列化后的位字符串包含的信息量,來比較無模式和模式驅(qū)動(dòng)的序列化規(guī)范。
最左邊的處理方法序列化后的位字符串的信息量是最大的,都是無模式序列化規(guī)范(Schema-less Serialization Specififications),比如BSON,Smile,FlexBuffers等,因?yàn)樽畲蟮乇A袅嗽紨?shù)據(jù)及其結(jié)構(gòu)的信息描述。最右邊的信息量是最小的,比如ASN.1,因?yàn)樗麄儼逊浅6嗟慕Y(jié)構(gòu)信息已經(jīng)在規(guī)范中提前約定,因此不需要寫入序列化后的位字符串中。
存在即是合理,這些模式都沒有最好最壞,每種模式都可以在特定的場(chǎng)景發(fā)揮對(duì)應(yīng)場(chǎng)景需要的作用。
??想了解更多內(nèi)容,請(qǐng)?jiān)L問:??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??