MsgPack的浅浅理解

前言

记得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序列化,在保证客户端与服务端的接口类文件必须保持一致!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值