Msgpack有沒有興趣了解一下?
- 2019 年 10 月 6 日
- 筆記
在我們做開發的時候經常會考慮到客戶端伺服器通訊到問題,簡單的來說就是客戶端首發數據的問題。
那麼,對於收發的數據這個內容,其實大有講究,關於收發數據,我們通常情況下都會毫不猶豫的會說json數據,xml數據,基本上就這麼多了,現在基本上都是json數據為主了,那我們今天來介紹的是比json還好用的數據結構——msgpack。
比json好用的數據其實有很多,例如上次我們提到過的protobuf,這是google提供的一個數據結構,能改很大程度上改善傳送數據的大小和結構,默認讀取的數據都會解析成字元串。那我們為什麼會選則使用msgpack呢?
首先引用msgpack官網用一句話總結:

msgpack會將數據打包成二進位的數據,它的數據格式與json類似,但是在存儲時對數字、多位元組字元、數組等都做了很多優化,減少了無用的字元,二進位格式,也保證不用字元化帶來額外的存儲空間的增加,所以在很大程度上減少來傳輸數據的大小。如果說把json數據的大小比作西瓜大小,那麼protobuf就是蘋果大小,msgpack呢,則是紅豆大小,所以msgpack使用優勢還是很明顯的!
下面我們來看看來自msgpack官網的第二張圖:

一組json數據長度是是27個bytes,因為使用json這樣的數據格式,在這個格式上就會消耗9個位元組(分號,大括弧之類的,這些數據其實),然後在數據的表示上也會有優化
,例如,關於數據Ture,在msgpack裡面直接給一個位元組就可以表示true(0xc3),關於結構化數據,例如字元串,數組等,類型後面加 1~4個位元組,用來存字元串的長度,如果是字元串長度是256以內的,只需要1個位元組,MsgPack能存的最長的字元串,是(2^32 -1 ) 最長的4G的字元串大小。如果是字典的類型的數據的話,需要加1~4個位元組表示後面有多少個項。
關於如何使用Msgpack?
msgpack這麼好用,我們應該如何使用它呢?
這和json用起來是一樣的,無非就是打包和解包。這裡我們採用python來演示一下。
想在python中使用msgpack,就需要安裝msgpack模組,我們還是老樣子,使用pip進行安裝:
pip install msgpack
安裝完之後導入這個模組,就可以使用了。
import msgpack msgpack.packb([1, 2, 3], use_bin_type=True) 'x93x01x02x03' msgpack.unpackb(_, raw=False) [1, 2, 3]
如程式碼所示,我們採用packb對數據進行打包,使用unpackd進行解包。
我們還可以藉助於bytesIO打包數據:
import msgpack from io import BytesIO buf = BytesIO() for i in range(100): buf.write(msgpack.packb(i, use_bin_type=True)) buf.seek(0) unpacker = msgpack.Unpacker(buf, raw=False) for unpacked in unpacker: print(unpacked)
在使用packb和unpackb方法時可以默認只傳一個參數,也就是要打包/解包的數據,其他都可以默認不傳。
除了使用packed方法,msgpack很人性化的提供了另一種打包和解包的方法,這個方法和json打包/解包的方法一樣,那就是dumps和loads方法了:
import msgpack a = msgpack.dumps([1, 2, 3], use_bin_type=True) msgpack.loads(a, raw=False)
以上就是小編這次給大家帶來的msgpack的介紹了。