我们在使用 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

MessagePack Jackson 数据大小的更多相关文章

  1. WCF+Restfull服务 提交或获取数据时数据大小限制问题解决方案

    近日在使用wcf的restfull架构服务时遭遇到了提交大数据的问题. 大数据包含两种情形: 1)单条数据量过大. 2)提交或获取的数据条数过多. 在测试时发现,默认设置下当单条JSON数据大于30K ...

  2. mysql查询表的数据大小

    在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.要查询表所占的容量,就是把表的数据和索引加起来就可以了 ...

  3. [转] MySQL 查询表数据大小的总结

    一:关于mysql表数据大小 我们知道mysql存储数据文件一般使用表空间存储 当mysql使用innodb存储引擎的时候,mysql使用表存储数据分为共享表空间和独享表空间两种方式 ·共享表空间:I ...

  4. 查询mysql数据库表的信息(表大小、数据大小、索引大小)

    select * from information_schema.TABLES where information_schema.TABLES.TABLE_SCHEMA='databasename' ...

  5. Mysql表大小数据大小索引大小查询

    SELECT CONCAT(ROUND((INDEX_LENGTH+DATA_LENGTH)/1024/1024, 2), 'MB') AS '总大小',CONCAT(ROUND(DATA_LENGT ...

  6. 速查mysql数据大小

    速查mysql数据大小 # 1.查看所有数据库大小 mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data ...

  7. MySQL 性能优化--优化数据库结构之优化数据大小

    MySQL性能优化--优化数据库结构之优化数据大小   By:授客  QQ:1033553122 尽量减少表占用的磁盘空间.通常,执行查询期间处理表数据时,小表占用更少的内存. 表列 l   尽可能使 ...

  8. Android获取 应用程序大小,数据大小,缓存大小

    在项目中创建,android.content.pm 包名.里面创建两个aidl文件.PackageStats.aidl  和 IPackageStatsObserver.aidl. PackageSt ...

  9. 003-mysql查询表的数据大小

    在需要备份数据库里面的数据时,我们需要知道数据库占用了多少磁盘大小,可以通过一些sql语句查询到整个数据库的容量,也可以单独查看表所占容量. 1.查看数据库表结构大小,要查询表所占的容量,就是把表的数 ...

随机推荐

  1. HTML DOM focus() 方法

    目录 HTML DOM focus() 方法 实例 定义和使用 浏览器支持 语法 参数 技术描述 更多实例 实例 实例 HTML DOM focus() 方法 实例 为 <a> 元素设置焦 ...

  2. pt工具

    percona-toolkit简介percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql任务和系统任务,这些任务包括: 检查master和slav ...

  3. python-迭代器实现异步(在串行中)

    import timedef consumer(name): print('%s 准备吃包子啦!' %name) while True: baozi = yield #yield不但可以返回值还可以接 ...

  4. 解决FileInputStream 读取文件中文乱码问题(转)

    当Java中使用 FileInputStream 读取txt等文档时,中文会产生乱码,解决方法如下: try { fis = new FileInputStream(file); InputStrea ...

  5. 移动站Web开发图片自适应两种常见情况解决方案

    本文主要说的是Web中图片根据手机屏幕大小自适应居中显示,图片自适应两种常见情况解决方案.开始吧 在做配合手机客户端的Web wap页面时,发现文章对图片显示的需求有两种特别重要的情况,一是对于图集, ...

  6. (二)创建基于maven的javaFX项目

    首先使用IDEA创建一个javaFX项目 点击finish,这就创建完成了JavaFX项目,只有将其转换为maven项目即可,如图:

  7. O041、Resize Instance 操作详解

    参考https://www.cnblogs.com/CloudMan6/p/5548294.html   Resize 的作用是调整instance的vCPU.内存和磁盘资源.   Instance  ...

  8. python对比线程,进程,携程,异步,哪个快

    目录概念介绍测试环境开始测试测试[单进程单线程]测试[多进程 并行]测试[多线程 并发]测试[协程 + 异步]结果对比绘图展示概念介绍首先简单介绍几个概念: 进程和线程进程就是一个程序在一个数据集上的 ...

  9. js div模拟水平滚动条

    这个也是我百度到的,但是忘记保存连接了,现在把代码贴上来,有需要的可以参考一下: <!DOCTYPE html> <html> <head> <meta ch ...

  10. VSCode中Markdown目录显示异常

    更新最新的VSCode之后编辑Markdown文件发现TOC标签的目录格式异常,发现是因为行尾字符导致,必须设置行尾字符进行解决.