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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
对Joomla用户模式进行颠覆,除了好用还免费?
六艺Joomla用户管理组件是对Joomla系统用户管理组件的功能改革。Joomla的标准用户登录/注册是以用户名+密码的形式进行,需要邮件激活账户,很不方便被很多用户网站所诟病,现在我们改变了它! 虽然我们一致认为Joomla是出色的内容管理系统,要说Joomla的不好,也的确存在需要改进的地方。用户注册与登录功能就是常年被用户尤其是中国用户所诟病。不算很差但确实不够人性化。 原来Joomla的注册方式是:名称+用户名+两遍密码+两遍邮箱+登录邮箱确认激活=完成注册 在当今每人游走于各平台都需要验证登录的情况下,记住一套用户名和密码显然是不方便的。这个功能如同Joomla的软肋,让广大中国用户觉得总是尺码不对,用着别扭。 几年来我们决心要升级它,我们精心策划交互逻辑,在确保安全的前提下,使它更加方便、快捷,更适合中国用户的使用习惯。现在,它来了。六艺Joomla用户管理组件,为Joomla用户注册登录提供了灵活的选择:手机验证码注册、或邮箱注册。这不仅解决了网站用户对快速简便的要求,更重要的是作为网站管理者,能够直接获取用户的有效信息,而不是单纯是邮箱和张三李四的昵称。会不会觉得很爽...
- 下一篇
[Spring cloud 一步步实现广告系统] 15. Binlog 增量准备
MySQL Binlog简介 什么是binlog? 一个二进制日志,用来记录对数据发生或潜在发生更改的SQL语句,并以而进行的形式保存在磁盘中。 binlog 的作用? 最主要有3个用途: 数据复制(主从同步) Mysql 的Master-Slave协议,让Slave可以通过监听binlog实现数据复制,达到数据一致性目的 数据恢复 通过mysqlbinlog工具恢复数据 增量备份 Binlog 变量 log_bin (Binlog 开关,使用show variables like 'log_bin';查看) binlog_format (Binlog 日志格式,使用show variables like 'binlog_format';查看) 日志格式总共有三种: ROW, 仅保存记录被修改的细节,不记录SQL语句上下文相关信息。(能清晰的记录下每行数据的修改细节,不需要记录上下文相关信息,因此不会发生某些特定情况下的procedure、function以及trigger 的调用无法被准确复制的问题,任何情况下都可以被复制,且能加快从库重放日志的效率,保证从库数据的一致性) STAT...
相关文章
文章评论
共有0条评论来说两句吧...