MessagePack簡析

MessagePack是什麼

MessagePack 特點:編解碼高效,效能高;序列化之後的碼流小。

MessagePack 是一種高效的二進位制序列化格式。它允許您像JSON一樣在多個語言之間交換資料。

但是在儲存時對數字、多位元組字元、陣列等都做了很多最佳化,減少了無用的字元,二進位制格式,也保證不用字元化帶來額外的儲存空間的增加。

MessagePack簡析

官方示意圖

MessagePack的壓縮原理

布林型別的:

直接給1個位元組,(0xc3 表示true,0xc2表示false)

不用表示長度的:就是數字之類的,他們天然是定長的,是用一個位元組表示後面的內容是什麼,比如用(0xcc 表示這後面,是個uint 8,用oxcd表示後面是個uint 16,用 0xca 表示後面的是個float 32)。對於數字做了進一步的壓縮處理,根據大小選擇用更少的位元組進行儲存,比如一個長度<256的int,完全可以用一個位元組表示。

不定長的:比如字串、陣列、二進位制資料(bin型別),型別後面加 1~4個位元組,用來存字串的長度,如果是字串長度是256以內的,只需要1個位元組,MessagePack能存的最長的字串,是(2^32 -1 ) 最長的4G的字串大小。

高階結構:MAP結構,就是k-v 結構的資料,和陣列差不多,加1~4個位元組表示後面有多少個項

Ext結構:表示特定的小單元資料。也就是使用者自定義資料結構

為什麼MessagePack比json序列化使用的位元組流更少

可以透過下圖的兩張圖簡單進行下對比,第一張圖是同一個資料型別的內容用json和messagepack序列化的結果。

MessagePack簡析

MessagePack簡析

MessagePack的使用

語言的支援:c、java、ruby、python、php。。。

各個語言的使用可到:https://msgpack。org/index。html檢視

MessagePack的問題

相容性問題。不同語言的客戶端的不同版本經常發生相容性。

解析需要自己寫,沒有封裝類,序列化和反序列化需要嚴格對齊格式及順序,容易出錯;另外空欄位需要佔位;資料結構有巢狀時使用Extension封裝較麻煩

總結:按需選擇

官方地址:https://github。com/msgpack/msgpack/blob/master/spec。md