使用 MessagePack 序列化数据

简介

http://msgpack.org/

MessagePack 官方的解释:
MessagePack is an efficient binary serialization format. It lets you exchange data among multiple languages like JSON. But it's faster and smaller. Small integers are encoded into a single byte, and typical short strings require only one extra byte in addition to the strings themselves.
MessagePack 是一个高效的二进制序列化格式。它让你像 JSON 一样可以在各种语言之间交换数据。但是它比 JSON 更快、更小。小的整数会被编码成一个字节,短的字符串仅仅只需要比它的长度多一字节的大小。
官方用一句话总结:
** It's like JSON. **
** but fast and small. **
现在来看,redis 支持 MessagePack 格式,以及 pintrest 等公司,也在积极得使用这个协议进行开发,说明这个格式确实有很多先进性。

使用 MessagePack 序列化数据_第1张图片
这张图片是以前 MessagePack 官方网站的首页图片,数字对比确实很能反映问题。
使用

通常 web 上做 RPC 通讯(Remote Procedure Call Protocol,远程过程调用协议)或者结构化数据存储,通常会采用 json,但是缺点就是占用空间相对会比较大。Google 的 Protocol Buffers 是个不错的序列化替代方案。

虽然 protobuf 的压缩性能比较好,但是要实现定义 message 的结构体,不如 json 这么方便和容易更改。而 msgpack 相比之下就有这些优点:

  • 兼容 json 的数据格式
  • 比 json 的序列化更省时间和空间
  • 支持很多种语言(python,java,ruby等等)

对 python 而言,需要先安装 msgpack 的包:

$ pip install msgpack-python​

官方示例:

>>> import msgpack
>>> msgpack.packb([1, 2, 3])
'\x93\x01\x02\x03'
>>> msgpack.unpackb(_)
[1, 2, 3]

下面有个测试,序列化数据采用不同的方法,包括 python 的 msgpack, simplejson和cPickle:

# -*- coding: utf-8 -*-

import msgpack
import simplejson
import cPickle
 
msg = {"cmd":"update", "data":{"uid":123, "name":"tom"}}
pmsg = msgpack.dumps(msg)
print len(pmsg)  # 32
 
smsg = simplejson.dumps(msg)
print len(smsg)  # 54
 
cmsg = cPickle.dumps(msg)
print len(cmsg)  # 85

对于多次使用 msgpack,可以先构造 packer 和 unpacker 对象:

# -*- coding: utf-8 -*-

import msgpack
 
msg =  {"cmd":"update", "data":{"uid":123, "name":"tom"}}
packer = msgpack.Packer()
pmsg = packer.pack(msg)

unpacker = msgpack.Unpacker()
unpacker.feed(pmsg)
msg = unpacker.unpack()

总结一下:
MessagePack 是一个基于二进制高效的对象序列化类库,可用于跨语言通信。它可以像 JSON 那样,在许多种语言之间交换结构对象;但是它比 JSON 更快速也更轻巧。支持 Python、Ruby、Java、C/C++ 等众多语言。比 Google 的 Protocol Buffers 还要快4倍。

你可能感兴趣的:(使用 MessagePack 序列化数据)