简介

MessagePack是一种高效的2进制序列化数据格式,你可以在不同的语言环境中使用它来进行数据通信(如PHP -> js, cpp -> js, lua -> js 等),就像使用JSON数据格式一样,但它比同级别的json数据要小,传输和解析速度也更快。因此有很多开发者考虑用它来替代JSON作为数据传输的解决方案。
目前市面上绝大多数流行的开发语言都有了支持msgpack的类库。js也不例外,但是能在浏览器环境下跑的不是特别多,主要原因我觉得是:
1.只有大多数新的浏览器才支持对2进制数据直接进行访问控制,因此兼容性大打折扣
2.json数据对前端太友好了,数据无痛读取,没有兼容性问题,何苦自废武功寻求这种「另类」的解决方案。

如果必须使用的话,目前官方推荐的msgpack-lite这个库还是能用的,其自称性能还不错。
git地址:
https://github.com/kawanet/msgpack-lite

用法

用法就超级简单了,msgpack.encodemsgpack.decode一下就可以得到msgpack数据/json数据了。

1
2
3
4
5
6
7
8
// encode from JS Object to MessagePack (Buffer)
var buffer = msgpack.encode({"foo": "bar"});
// decode from MessagePack (Buffer) to JS Object
var data = msgpack.decode(buffer); // => {"foo": "bar"}
// if encode/decode receives an invalid argument an error is thrown

因为编程语言的差异,如果遇到解析出来本来应该是字符串的字段值是一个Uint8Array,那么可能就需要用TextDecoder再转解析一下:

1
2
3
4
5
6
7
var decoder = new TextDecoder('utf-8');
// bytes模拟数据表示msgpack.decode后取到的`Uint8Array`
var bytes = new Uint8Array([207, 240, 232, 226, 2]);
var data = decoder.decode(bytes);