当前位置: 首页 > 知识库问答 >
问题:

Jackson是否使用稳定的二进制序列化?

白宏义
2023-03-14

我有一个外部键值存储,其中包含每个键的一组二进制值。这些二进制值是使用Jackson2.5和Scalaplugin序列化的Scala对象。

为了在存储中保留集合语义,对象的二进制表示应该是稳定的,即序列化两次应该得到相同的字节序列。杰克逊有这个保证吗?例如,如果它使用JSON序列化作为中间步骤,则没有节点排序,因此二进制序列化将不稳定。

如果对象内部包含无序结构(如集合或映射),这可能会变得更加棘手。杰克逊能处理吗?

如果没有,是否有合理的替代方案?

更新:

我找到了com.fasterxml.jackson.databind.serializationfeature.order_map_entries_by_keys,它解决了部分问题。

共有1个答案

笪煌
2023-03-14

您可以使用选项SORT_PROPERTIES_ALPHABEITY来实现稳定的序列化,如本问题的答案中所提到的(与前面提到的选项ORDER_MAP_ENTRIES_BY_KEYS一起使用)。

在这些电子邮件中解释了一些更多的背景:
“...在没有显式声明(通过@jsonPropertyOrder)和一般机制(按字母顺序排序;在其他属性之前的对象Id和类型Id)的情况下,没有定义的排序。”

“需要注意的一点是,Oracle确实改变了JDK7的行为,使得以前由内省返回的方法和字段的稳定顺序变得任意。”...“现有的默认排序基于JDK提供的简单遍历和排序;...”。
(复制自Tatu Saloranta的电子邮件)。

 类似资料:
  • 问题内容: 当尝试使用Jackson序列化一个非常简单的对象时,出现异常。错误: org.codehaus.jackson.map.JsonMappingException:未找到类MyPackage.TestA的序列化程序,也未发现创建BeanSerializer的属性(为避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) 以下是要

  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 我有一个JSON作为字符串,我将其反序列化并实例化为scala的MyPOJO case类。我的数据是YYYY-MM-DD格式,但POJO createdBy中的实际属性是LocalDateTime。 如何在实例化Pojo时指定默认时间值2020-03-02 00:00:00, 序列化应返回yyyy-mm-dd格式。我的序列化和反序列化格式不同。 我尝试过自定义序列化和反序列化,如下所示,但由于缺少

  • 本文向大家介绍什么是C#中的二进制序列化和反序列化?如何在C#中实现二进制序列化?,包括了什么是C#中的二进制序列化和反序列化?如何在C#中实现二进制序列化?的使用技巧和注意事项,需要的朋友参考一下 将对象转换为非人类可读格式的二进制格式称为二进制序列化。 将二进制格式转换回人类可读格式称为反序列化? 为了在C#中实现二进制序列化,我们必须使用库System.Runtime.Serializati

  • 来自REST服务的json对象 使用JacksonInFiveMinutes中的代码 ObjectMapper mapper=new ObjectMapper(); Map userData=mapper.read值(webResource.queryParams(queryParams). get(String.class);, Map.class); 在哪里: 从REST服务返回json 从J

  • 本文向大家介绍Java,C#使用二进制序列化、反序列化操作数据,包括了Java,C#使用二进制序列化、反序列化操作数据的使用技巧和注意事项,需要的朋友参考一下 java使用二进制序列化、反序列化的操作首先,要引入java.io下面相关包,或者直接写import java.io.*; 下面,为了书写操作的方便,采用复制文件,和throws声明异常的方式来写 初略代码,仅供参考! C#使用二进制序列化