简介
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 等公司,也在积极得使用这个协议进行开发,说明这个格式确实有很多先进性。
使用
通常 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倍。