杰克逊使用稳定的二进制序列化吗?

时间:2015-08-28 16:37:54

标签: java json scala serialization jackson

我有一个外部键值存储,每个键包含一组二进制值。这些二进制值是使用带有ScalaPlugin的Jackson 2.5序列化的Scala对象。

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

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

如果没有,是否有合理的选择?

更新

我发现com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS解决了部分问题。

1 个答案:

答案 0 :(得分:2)

您可以使用this question答案中提到的SORT_PROPERTIES_ALPHABETICALLY选项来实现稳定的序列化(以及您已提到的选项ORDER_MAP_ENTRIES_BY_KEYS)。

these emails中解释了更多背景知识:
“......在没有显式声明(通过@JsonPropertyOrder)和一般机制(按字母顺序排序;对象ID和类型ID在其他属性之前)之前,没有定义的排序。”

“有一点需要注意的是,Oracle确实改变了JDK 7的行为,因此以前对Introspection返回的方法和字段的稳定排序变得随意。” ...“现有的默认排序基于JDK提供的简单遍历和排序; ......”。
(从Tatu Saloranta的电子邮件中复制)。