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

640?wx_fmt=png


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

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

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

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

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

640?wx_fmt=png

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

變長實數


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

640?wx_fmt=png

事實上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種數據類型做“長度壓縮”。

640?wx_fmt=png

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

640?wx_fmt=png

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

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

640?wx_fmt=png

圖中,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

640?wx_fmt=png

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

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

取名吐槽

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

(完)

640?wx_fmt=png

【日記】


CSDN的“公衆號同步文章”功能成功將文章中的圖片外包到騰訊的服務器上了,比如一個圖片鏈接:

https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_jpg/MpRDliazuVE2YeichQVupFG1joUB7PxEC3F4VHwc1SGsNwgMLaKNtZsGdX73crmTWcoR0xFyrukicJmuAln3CqwWA/640?wx_fmt=jpeg

看上去是來自csdn.net,仔細一看url後面跟着另一個url,其實圖片數據來自qpic.cn,只是從csdb.net反向代理了一下,其實CSDN可以將真實的url稍微編碼一下,變成亂碼就看不出來這種操作了🙂

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章