MessagePack 是一种高效的二进制序列化格式。
它许可您像JSON一样在多个措辞之间交流数据。
但是在存储时对数字、多字节字符、数组等都做了很多优化,减少了无用的字符,二进制格式,也担保不用字符化带来额外的存储空间的增加。

官方示意图

MessagePack的压缩事理布尔类型的:直接给1个字节,(0xc3 表示true,0xc2表示false)不用表示长度的:便是数字之类的,他们天然是定长的,是用一个字节表示后面的内容是什么,比如用(0xcc 表示这后面,是个uint 8,用oxcd表示后面是个uint 16,用 0xca 表示后面的是个float 32)。
对付数字做了进一步的压缩处理,根据大小选择用更少的字节进行存储,比如一个长度<256的int,完备可以用一个字节表示。
不定长的:比如字符串、数组、二进制数据(bin类型),类型后面加 1~4个字节,用来存字符串的长度,如果是字符串长度是256以内的,只须要1个字节,MessagePack能存的最长的字符串,是(2^32 -1 ) 最长的4G的字符串大小。
高等构造:MAP构造,便是k-v 构造的数据,和数组差不多,加1~4个字节表示后面有多少个项Ext构造:表示特定的小单元数据。
也便是用户自定义数据构造为什么MessagePack比json序列化利用的字节流更少

可以通过下图的两张图大略进行下比拟,第一张图是同一个数据类型的内容用json和messagepack序列化的结果。

phpmsgpackMessagePack简析 PHP

MessagePack的利用

措辞的支持:c、java、ruby、python、php...

各个措辞的利用可到:https://msgpack.org/index.html查看

MessagePack的问题 兼容性问题。
不同措辞的客户真个不同版本常常发生兼容性。
解析须要自己写,没有封装类,序列化和反序列化须要严格对齐格式及顺序,随意马虎出错;其余空字段须要占位;数据构造有嵌套时利用Extension封装较麻烦

总结:按需选择

官方地址:https://github.com/msgpack/msgpack/blob/master/spec.md