前言
记得18年3月刚刚入职的时候,企业邮箱收到的第一个事故报告就是说在bean中添加字段没有加在字段序的最后导致线上出问题,我只是知其然不知其所以然。于是趁着过年没有紧急任务,查阅一些资料充充电。
MsgPack是何方神圣
直接看官方的解释吧,说的挺明白的:
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.
就像JSON,但更快更小。
我司的RPC(远程服务调用方案)序列化反序列化方式就是用的MsgPack,要求新加的字段必须在bean字段序的最后,为什么?与Hessian序列化比较方便理解。
MsgPack与Hessian的区别
区别
MsgPack序列化的时候,按照字段顺序写入字段值,理解为数组;
Hessian序列化的时候,写入字段名称然后写入字段值,理解为map(K-V)。
差距
MsgPack产生的数据更小,从而在数据传输过程中网络压力更小;
MsgPack(数组取值)比Hessian(map取值)性能更好;
MsgPack兼容性差,必须按照顺序保存字段,Hessian可以随意位置添加字段;
MsgPack是二进制序列化格式,兼容跨语言;
MsgPack不支持匿名集合类(例如List.subList(),Map.keySet(),Collections.emptyList(),Guava的匿名集合类)。
总结
正式因为MsgPack是按照字段顺序写入字段值,所以不能随意插入字段。
为了性能及跨语言兼容性,这些牺牲是值得的。使用msgpack序列化,在保证客户端与服务端的接口类文件必须保持一致!!