MessagePack

MessagePack实践总结

和JSON类似,MessagePack也是一种No Schema的序列化方式,不必像Protobuf那样预先定义数据结构。但是它要比JSON更高效:使用字节类型的标识符表示数据类型和长度,序列化后的数据占用空间更小、处理效率更高。它拥有良好的设计和出色的表现,唯一不足的是各个语言的类库实现还并不完善,在跨语言的交互中会遇到很多问题。

背景资料

问题汇总

Java

说明

老版本类库指0.6.x

新版本类库指0.7.x

 老版本类库问题

1. 将一个JavaBean序列化成Array而非Map(不包含字段名)

  • 解决方案:通过继承的方式重写原有的序列化逻辑

2. 不支持JavaBean中Map<String, Object>类型字段的序列化

  • 解决方案:添加Object类型的模板,或转换成Map<String, Object>进行序列化

3. 将枚举类型序列化为序数而非字符串

  • 解决方案:修改枚举类型序列化的模板

补充解决方案

跨语言

1. php将空的map反序列化成空对象,而不是空数组

  • 解决方案:php将php_only配置项置为false

2. Java新版本类库增加str8类型的序列化,而php还未支持

  • java老版本序列化时仅使用fixstr和str16,不使用str8,但反序列化时fixstr、str8、str16均可以支持
  • java新版本序列化时会使用str8,反序列化也支持
  • php当前版本序列化不使用str8,反序列化也不支持str8,所以遇到str8的标识符0xd9时会报错

解决方案

解决方案1:Java修改新版本类库,序列化中不再使用str8

解决方案2:php修改扩展支持反序列化str8类型

 

© 2015, 高飞航.cn. 版权所有.

About gaofeihang

开发工程师,本站的作者。欢迎留下您宝贵的意见!

发表评论

电子邮件地址不会被公开。 必填项已用*标注