天天看點

MessagePack:最可能取代JSON的存在。

科普一個冷門的,但是很強的技術:MessagePack,簡稱msgpack。msgpack不是軟體,是一個标準,可以先把它看成二進制的json,“二進制json”容易讓人聯想到一個更流行一點的标準:BSON。如果你不知道bson是啥可以去查一下,總之msgpack和bson是同類型的競争産品,但是msgpack無論從速度還是體積上都秒殺bson,至少在網絡傳輸上是這樣的。

json都知道是啥吧,在序列化領域神一般的存在。什麼是序列化呢,其實就是降維打擊:任何多元的資料對象都必須被降維打擊成一維才能進行存儲和網絡傳輸。

msgpack也是一個降維打擊,哦不,序列化的手段,隻不過它序列化的結果是二進制格式而非json的文本格式,不了解的可以類比http1.1和http2.0,就是一個由文本格式進化到二進制格式的例子。

這種進化有什麼好處以後專門寫一篇文章談談,題目暫定《從字元時代到二進制時代》。本文談談msgpack有什麼好處,為啥說它能取代json?

首先按官方的話說,msgpack比json小,比json快。比json小是一定的,官網上有一個例子:

上面那個json串在utf8編碼下每個字元一個位元組,總共27位元組,轉換成msgpack格式之後隻剩下18位元組,壓縮了三分之一。之是以msgpack能夠壓縮是因為json串本身有許多沒用的資訊,比如每一個key的雙引号就可以省去,簡單的Boolean類型非要用四五個位元組來表示(true和false)。當然XML的沒用資訊就更多了,這些都是文本格式本身的弊端,二進制格式就是來解決這些問題的,比如數字就是數字,就應該用二進制表示。

變長實數

msgpack對實數類型的一個特色是可變長的實數類型,以至于128以下的正整數都可以用1個位元組表示!如果說bson編碼在某些情況下回比json還大,那msgpack在任何情況下都比json小,最壞的情況下比如10以内的正整數,壓縮率才是100%,比如:(但即使這樣msgpack的速度還快)

事實上msgpack提供10種不同長度的整數,通過不同的字首來區分類别,這樣如果僅存儲一個人的年齡的話就不必浪費64位浮點數的奢侈空間了,這就是字首編碼的魅力。具體可以去看看它的spec:

https://github.com/msgpack/msgpack/blob/master/spec.md

然後msgpack比json快就不用說了,json本身的編譯就需要更多的時間,尤其是10進制實數和二進制數之間的轉化。msgpack之是以比json又快又好,是因為:

msgpack遵循最優編碼

最優編碼也叫Huffman編碼,什麼是最優編碼呢,用我自己的話說就是,沒有浪費一丁點資訊。那什麼樣的編碼會浪費資訊呢?定長編碼就容易浪費資訊,舉一個例子,設計這樣一套編碼,每一種資料由1位元組的類型段和多位元組的資料段組成(類型字段暗示了資料字段的長度),然後線性排列(序列化),其中1個位元組所表示的256種類型必須全部用到才不會造成浪費,否則剩下的必須作為“保留類型”才說得過去。

如果我們真的不需要那麼多種資料類型,甚至100種都用之不盡,那麼可以對剩下的156種資料類型做“長度壓縮”。

如圖,怎麼辦?Huffman編碼告訴我們可以将這棵完全二叉樹的右半部分收斂成度為2的葉子,變成更優的二叉樹:

如圖,第五種類型是最短的,應當留給使用頻率最高的資料類型。

但這還不是最優二叉樹,最優樹還要更具每種類型出現的頻率來考慮樹的長勢。msgpack就是按這個思想來繪制自己的最優二叉樹的。但是當我用百度腦圖将msgpack的最優樹畫出來以後發現它好像并沒有嚴格按照Huffman樹的畫法,而是有些任性:

圖中,37種資料類型中居然有32個類型都是8個bit字首,全部挂載在“110”之後。當然,也許是為了硬體考慮,也許資料類型真的的不好按照使用頻率來排序。總之msgpack采用huffman來編碼是非常有眼光的。

Message Pack  VS  JSON

既然msgpack比json又小又快,json真的一無是處嗎?雖然在網絡傳輸的應用場景上msgpack可以完勝json,可作為配置檔案的場景上又如何呢?我們知道JSON格式對使用者是很友好的,可讀性非常強,在編輯器中代碼折疊,類型高亮都非常友善。msgpack作為二進制格式似乎不好直接編輯。

naive!

為什麼不能圖形化編輯二進制檔案呢?靈感來自json-editor(json圖形化編輯器)項目:https://jimmy.blog.csdn.net/article/details/87446545

由于現在msgpack還不流行,msgpack-editor項目還不存在,如果你感興趣可以先把它做出來,這樣一來就可以愉快的編輯二進制的配置檔案了,圖形化編輯器比文本編輯器更友好,不僅可以提供很多快捷功能還能有效的查錯。

經過本文的分析,message pack在各個領域都可以完勝json,取代後者隻是時間問題。

取名吐槽

唯一感到美中不足的是,message pack這個名字取得不太滿意,不夠具有吸引力,不像BSON那樣“霸道”和簡短。如果我來開發,我會叫他Huffman Pack或者Huffman serializator之類的名字。

(完)