大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们在使用 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 中的内容。
考察下面的代码:
ListdataList = 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 对象的时候添加一部分参数,我们会发现大小将会有显著改善。
请参考下面的代码:
ListdataList = 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
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。