我有一个外部键值存储,每个键包含一组二进制值。这些二进制值是使用带有ScalaPlugin的Jackson 2.5序列化的Scala对象。
为了保留存储器中的集合语义,对象的二进制表示应该是稳定的,即将其序列化两次应该产生相同的字节序列。杰克逊有这个保证吗?例如,如果它使用JSON序列化作为中间步骤,则没有节点排序,因此二进制序列化将不稳定。
如果对象内部包含无序结构(如集合或映射),则可能会变得更加棘手。杰克逊会处理吗?
如果没有,是否有合理的选择?
更新
我发现com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS
解决了部分问题。
答案 0 :(得分:2)
您可以使用this question答案中提到的SORT_PROPERTIES_ALPHABETICALLY
选项来实现稳定的序列化(以及您已提到的选项ORDER_MAP_ENTRIES_BY_KEYS
)。
these emails中解释了更多背景知识:
“......在没有显式声明(通过@JsonPropertyOrder)和一般机制(按字母顺序排序;对象ID和类型ID在其他属性之前)之前,没有定义的排序。”
和
“有一点需要注意的是,Oracle确实改变了JDK 7的行为,因此以前对Introspection返回的方法和字段的稳定排序变得随意。” ...“现有的默认排序基于JDK提供的简单遍历和排序; ......”。
(从Tatu Saloranta的电子邮件中复制)。