资讯专栏INFORMATION COLUMN

MessagePack Jackson 数据大小

MadPecker / 760人阅读

摘要:我们在使用对对象数据进行序列化的时候,发现序列化以后的二进制数组数据偏大的情况。考察下面的代码我们会发现,针对这个万个对象的的序列化后的数据达到了。如果我们再定义对象的时候添加一部分参数,我们会发现大小将会有显著改善。

我们在使用 MessagePack 对 List 对象数据进行序列化的时候,发现序列化以后的二进制数组数据偏大的情况。

请注意,不是所有的 List 对象都会出现这种情况,这个根据你 List 对象中存储的内容有关。

有关本问题的测试源代码请参考:https://github.com/cwiki-us-d... 中的内容。

考察下面的代码:

List dataList = MockDataUtils.getMessageDataList(600000);
 
ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
raw = objectMapper.writeValueAsBytes(dataList);
 
FileUtils.byteCountToDisplaySize(raw.length);
logger.debug("Raw Size: [{}]", FileUtils.byteCountToDisplaySize(raw.length));

我们会发现,针对这个 60 万个对象的 List 的序列化后的数据达到了 33MB。

如果我们再定义  ObjectMapper 对象的时候添加一部分参数,我们会发现大小将会有显著改善。

请参考下面的代码:

List dataList = MockDataUtils.getMessageDataList(600000);
 
ObjectMapper objectMapper = new ObjectMapper(new MessagePackFactory());
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setAnnotationIntrospector(new JsonArrayFormat());
 
rawJsonArray = objectMapper.writeValueAsBytes(dataList);
logger.debug("rawJsonArray Size: [{}]", FileUtils.byteCountToDisplaySize(rawJsonArray.length));

如果你运行上面的代码,你会看到程序的输出字符串将会降低到 23MB。

这里面主要是 objectMapper.setAnnotationIntrospector(new JsonArrayFormat()); 这句话起了作用。

在正常的场景中,我们可以通过 注解 JsonIgnore, 将其加到属性上,即解析时即会过滤到属性。

而实际实现,则是由类 JacksonAnnotationIntrospector 中 的 hasIgnoreMarker 来完成,则就是通过读取注解来判断属性是否应该被exclude掉。ObjectMapper中默认的 AnnotationIntrospector 即是 JacksonAnnotationIntrospector 来完成,但我们可以通过 方法 ObjectMapper.setAnnotationIntrospector 来重新指定自定义的实现。

https://www.cwiki.us/display/...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76015.html

相关文章

  • Java比特币开发教程:Java编程买卖比特币

    摘要:完整的步骤如下检查比特币或的余额,钱包地址。比特币的到帐时间是个块的高度,约分钟。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给Exi...

    xiaowugui666 评论0 收藏0
  • Java比特币开发教程:Java编程买卖比特币

    摘要:完整的步骤如下检查比特币或的余额,钱包地址。比特币的到帐时间是个块的高度,约分钟。 showImg(https://segmentfault.com/img/remote/1460000018952144?w=1200&h=659); 方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mixin Network的币币交易API. 你可以支付USDT给Exi...

    msup 评论0 收藏0
  • MessagePack 编解码

    摘要:是一个高效的二进制序列化框架它像一样支持不同语言间的数据交换但是它的性能更快序列化之后的码流更小的特点如下编解码高效性能高序列化之后的码流小支持跨语言编码器和解码器开发编码器开发负责将类型的对象编码为数组然后添加到集合中解码器开发首先从数 MessagePack 是一个高效的二进制序列化框架, 它像 JSON 一样支持不同语言间的数据交换, 但是它的性能更快, 序列化之后的码流更小. ...

    xuxueli 评论0 收藏0
  • 【物联网】7.物联网通信 - 数据格式(XML ,JSON,MessagePack)

    摘要:自然,设备还会通知多个传感器的值和机器的状态。然而的字符数较多,数据量较大。基于物联网服务处理这些格式时,要把文本数据转换成数值数据和二进制数据。因此,虽然这种数据格式不方便人们直接阅读,但计算机却能很容易地处理。 嵌入式开发中其实最重要的就是数据传输,这部分由于频繁的使用,高效的格式和算法...

    enda 评论0 收藏0
  • Java API中Msgpack支持Object类型

    摘要:支持等众多语言。此处的是经过封装的,和中类似。相关模板均在类中定义,诸如。优化后的使用方法为中的错误先看看这段代码反序列化后获取,因为中是类型,这里面可能是,也可能是,因此需要注意。参考资料让版支持类型 Msgpack简介 MessagePack is an efficient binary serialization format. It lets you exchange data...

    邹强 评论0 收藏0

发表评论

0条评论

MadPecker

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<