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的介紹了。