序列化组件对比

1、msgpack介绍

1.MsgPack产生的数据更小,从而在数据传输过程中网络压力更小

2.MsgPack兼容性差,必须按照顺序保存字段

3.MsgPack是二进制序列化格式,兼容跨语言

官网地址: https://msgpack.org/

官方介绍:It's like JSON. but fast and small.

压缩规范表:https://github.com/msgpack/msgpack/blob/master/spec.md?plain=1







简单分析msgpack例子

json格式:{"age":14, "subject":["math", "chinese", "english"]}

msgpack格式: 82 a3 61 67 65 0e a7 73 75 62 6a 65 63 74 93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68

解读:

82 :两组map,即两组key-value pairs of objects

a3 61 67 65 :第一组map的key,类型为fixstr为 "age"

0e :第一组map的value,类型为positive fixint为14

a7 73 75 62 6a 65 63 74 :第二组map的key,类型为fixstr为“subject”

93 a4 6d 61 74 68 a7 63 68 69 6e 65 73 65 a7 65 6e 67 6c 69 73 68 :第二组map的value是个array,元素内容为str

a4 6d 61 74 68:第一个数组对象类型为fixstr为"math"

a7 63 68 69 6e 65 73 65 :第二个数组对象类型为fixstr为"chinese"

a7 65 6e 67 6c 69 73 68:第三个数组对象类型为fixstr为"english"

拼装起来就是{ "compact" : true , "schema" : 0 }

具体magpack的核心压缩方式可参看官方说明messagepack specification,这里就不细介绍了

2、Hessian序列化介绍

hessian是一种基于二进制的远程调用协议。占用空间小,跨语言,反序列化快

hessian会把复杂对象所有属性存储在一个 Map 中进行序列化,通过名称进行取值

3、hessian和msgpack对比





通过以上两种协议的实现原理,我们可以清楚的明白为什么msgpack从中间新加变量为什么会出错了

4、为什么从中间添加字段调用方会序列化报错?

【原因分析】:Msgpack是按字段顺序进行序列化和反序列化的,其缺点是无法改变字段顺序。

【解决方案】:

因Msgpack序列化不能改变字段顺序,所以在两边不同时升级的情况下,字段兼容规则如下:

1、不要调整原有字段顺序,不能删减字段,除非是删最后一个字段。

2、新加的字段必须在字段最后面(只是字段顺序,不是文件最后面,getter/setter方法等随意)。

3、父类的字段不能变。因为父类一变相当于子类的中间插入一个字段。

满足上面规则,服务端和客户端哪边先升级都无所谓。

如果是需要父类加字段,或者中间加减字段这种,则需要服务端和调用端同时升级





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值