MessagePack是什麼
MessagePack 特點:編解碼高效,效能高;序列化之後的碼流小。
MessagePack 是一種高效的二進位制序列化格式。它允許您像JSON一樣在多個語言之間交換資料。
但是在儲存時對數字、多位元組字元、陣列等都做了很多最佳化,減少了無用的字元,二進位制格式,也保證不用字元化帶來額外的儲存空間的增加。
官方示意圖
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的使用
語言的支援:c、java、ruby、python、php。。。
各個語言的使用可到:https://msgpack。org/index。html檢視
MessagePack的問題
相容性問題。不同語言的客戶端的不同版本經常發生相容性。
解析需要自己寫,沒有封裝類,序列化和反序列化需要嚴格對齊格式及順序,容易出錯;另外空欄位需要佔位;資料結構有巢狀時使用Extension封裝較麻煩
總結:按需選擇
官方地址:https://github。com/msgpack/msgpack/blob/master/spec。md