zoukankan      html  css  js  c++  java
  • MessagePack Jackson 数据大小

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

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

    有关本问题的测试源代码请参考:https://github.com/cwiki-us-demo/serialize-deserialize-demo-java/blob/master/src/test/java/com/insight/demo/serialize/MessagePackDataTest.java 中的内容。

    考察下面的代码:

    List<MessageData> 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<MessageData> 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/Serialization/MessagePack+Jackson+Data+Size

  • 相关阅读:
    [poj解题]1017
    [算法] aov图拓扑算法
    【supervisord】部署单进程服务的利器
    【python】一个备份把文件备份到邮箱的python实现
    【GO】关于GO的浅显总结
    iOS开发快捷键
    iOS开发笔记
    VS2012智能提示无效解决方案
    国内几个WindowPhone广告平台
    纪念自己的第四个App:秘密Secret
  • 原文地址:https://www.cnblogs.com/huyuchengus/p/11333723.html
Copyright © 2011-2022 走看看