我有一个外部键值存储,其中每个键包含一组二进制值。这些二进制值是使用带有ScalaPlugin的Jackson 2.5序列化的Scala对象。
为了在存储中保留集合语义,对象的二进制表示形式应该是稳定的,即,对其进行两次序列化将导致相同的字节序列。杰克逊有这个保证吗?例如,如果它使用JSON序列化作为中间步骤,则没有节点排序,因此二进制序列化将不稳定。
如果对象内部包含无序结构(如集合或映射),则可能会变得更加棘手。杰克逊会处理吗?
如果没有,是否有合理的选择?
更新:
我发现com.fasterxml.jackson.databind.SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS
解决了部分问题。
最佳答案
您可以使用this question的答案中提到的选项SORT_PROPERTIES_ALPHABETICALLY
来实现稳定的序列化(以及您已经提到的选项ORDER_MAP_ENTRIES_BY_KEYS
)。
these emails中介绍了更多背景信息:
“ ...在缺少显式声明(通过@JsonPropertyOrder)和通用机制(按字母顺序排列;对象ID和类型ID在其他属性之前)的情况下,没有定义的顺序。”
和
“需要注意的一件事是,Oracle确实改变了JDK 7的行为,从而使以前自省的自省方法和字段的顺序变得任意。” ...“现有的默认排序基于JDK提供的简单遍历和排序; ...”。
(摘自Tatu Saloranta的电子邮件)。
关于java - Jackson是否使用稳定的二进制序列化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32275854/