dubbo序列化源码分析3-MessagePack协议

相同的bean 使用JSON和messagepack序列化,结果如下

JSON格式:{"age":23,"cache":{"test2":"qunge2","test1":"qunge1","test3":"qunge3"},"dataList":["tiancai1","tiancai2","tiancai3"],"id":11,"name":"changqun"}

messagepack格式: :��changqun��tiancai1�tiancai2�tiancai3��test1�qunge1�test2�qunge2�test3�qunge3

msgpack是JSON格式的优化

没有记录key,按照字段的自然顺序排列,用特殊符号代替  { " }  长度,类型。

普通JSON:{"compact":true,"schema":0}

msgpack

 

82 占一个字节 8代表Map类型 占4位 2 代表有2个entity 占4位

A7占一个字节 A代表String类型 7代表字符串长度

C3占一个字节 C代表Boolean类型 3代表 true

A6原理与A7相同

00代表数字0

半个字节最大只能表示15,如果字符串或定长类型大于15 怎么办

以 字符串为例 如果 大于15

0xd9表示大于15 一个字节表示 长度 后面是 数据。 一个 160字节的字符串 ,头信息就是 0xd9A0

推测:0xd9代表类型 和长度字节数

数值类型 如0xcc 259 0xcc 代表数据部分是1个字节长度的int类型。

总结:

定长的 如 int float 1字节表示类型和数据字节数+data

非定长的 如 String,Map, list , 1字节代表类型 和长度字节数+1~4字节长度+data

 

缺点 :如果在bean中间位置加入字段,调用方没有升级bean jar包,会发生反序列化异常。

MessagePack简介及使用

MessagePack的压缩原理
核心压缩方式可参看官方说明https://github.com/msgpack/msgpack/blob/master/spec.md
概括来讲就是:

  1. true、false 之类的:这些太简单了,直接给1个字节,(0xc3 表示true,0xc2表示false)
  2. 不用表示长度的:就是数字之类的,他们天然是定长的,是用一个字节表示后面的内容是什么,比如用(0xcc 表示这后面,是个uint 8,用oxcd表示后面是个uint 16,用 0xca 表示后面的是个float 32)。对于数字做了进一步的压缩处理,根据大小选择用更少的字节进行存储,比如一个长度<256的int,完全可以用一个字节表示。
  3. 不定长的:比如字符串、数组、二进制数据(bin类型),类型后面加 1~4个字节,用来存字符串的长度,如果是字符串长度是256以内的,只需要1个字节,MessagePack能存的最长的字符串,是(2^32 -1 ) 最长的4G的字符串大小。
  4. 高级结构:MAP结构,就是k-v 结构的数据,和数组差不多,加1~4个字节表示后面有多少个项
  5. Ext结构:表示特定的小单元数据。也就是用户自定义数据结构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值