# Serialization with Jackson# 依赖要应用Jackson序列化,必须在我的项目中增加以下依赖项:
# 介绍您能够在“序列化”局部中找到无关Akka序列化的概念。 本节形容如何应用Jackson序列化应用程序特定的音讯、持久性事件和快照。Jackson反对基于文本的JSON和二进制格局。在许多状况下,Jackson能够对一般类进行序列化而无需任何其余提醒,然而有时须要应用正文来指定如何将对象转换为JSON/字节。# 用法要为某个类启用Jackson序列化,您须要在序列化绑定配置中配置它或它的一个超类。 通常,您将为此创立一个标记器接口,并让音讯实现该接口。
而后,在序列化绑定中将标记器接口的类名称配置为:jackson-json或jackson-cbor
一个好的约定是将标记接口命名为CborSerializable或JsonSerializable。在本文档中,咱们应用MySerializable来明确表明Akka不提供标记接口自身。这是Jackson了解构造的根底类所须要的。上面介绍了须要正文的几种状况。请留神,只有顶级类或其标记接口必须在serialization-bindings定义,而不是它在成员字段中援用的嵌套类。>留神增加-parameters Java编译器选项,以供ParameterNamesModule应用。它缩小了某些正文。# 平安出于平安起因,不容许将Jackson序列化程序绑定到开放式类型,可能是序列化小工具的指标对象,例如:- java.lang.Object- java.io.Serializable- java.util.Comparable。Jackson数据绑定定义的可能序列化小工具类的回绝列表,须要查看并禁止反序列化。>正告不要应用@JsonTypeInfo(use = Id.CLASS)或ObjectMapper.enableDefaultTyping,因为应用多态类型会带来安全隐患。##格局反对以下格局,如上所述,您抉择在序列化绑定配置中应用哪种格局。- jackson-json-基于一般文本的JSON- jackson-cbor-二进制CBOR数据格式二进制格局比JSON格局更紧凑,性能稍好。# 注解## 单参数构造函数您可能会遇到如下异样:

MismatchedInputException:无奈结构...的实例(只管存在至多一个Creator):无奈从Object值反序列化(没有基于委托或基于属性的Creator)

这可能是因为该类的构造函数带有单个参数,例如:
能够通过增加@JsonCreator或@JsonProperty注解来解决:
或者
如Jackson文档中所述,应用JsonCreator.Mode.PROPERTIES配置ParameterNamesModule。## 多态类型多态类型是某个根本类型具备多个代替实现的状况。 如果嵌套字段或汇合是多态类型,则必须应用@JsonTypeInfo和@JsonSubTypes注解列出该类型的具体实现。例:
如果您尚未定义正文,则会看到如下异样:

InvalidDefinitionException:无奈结构...的实例(不存在任何创建者,如默认结构一样):形象类型须要映射到具体类型,具备自定义反序列化器或蕴含其余类型信息

请留神,对于顶级类,这不是必须的,但对于其中的字段,则须要。在此示例中,在动物园外部应用动物,该动物作为音讯发送或保留。如果动物是独立发送或长久保留的,则不须要正文,因为被序列化的是具体的子类Lion或Elephant。在应用这些注解指定容许的子类时,类名将不包含在序列化示意中,这对于避免反序列化时加载歹意序列化小工具很重要。>正告不要应用@JsonTypeInfo(use=Id.CLASS)或ObjectMapper.enableDefaultTyping,因为应用多态类型会带来安全隐患。# 架构演变在应用事件溯源以及进行滚动更新时,架构演变成为开发应用程序的重要方面。需要以及咱们对业务畛域的了解可能会(并且将会)随工夫而变动。Jackson序列化器提供了一种在反序列化期间执行JSON树模型转换的办法。对于文本格式和二进制格局,它以雷同的形式工作。咱们将钻研几种无关类如何演变的计划。## 移除字段无需迁徙任何代码即可删除字段。 Jackson序列化程序将疏忽该类中不存在的属性。## 新增字段无需迁徙任何代码即可增加可选字段。默认值为Optional.empty。旧类:
具备新的可选Discount属性和具备默认值的note字段的新类:
假如咱们要领有一个没有默认值的必填字段discount:
要增加新的必填字段,咱们必须应用JacksonMigration类并在迁徙代码中设置默认值。这是增加discount字段的迁徙类的样子:
笼罩currentVersion办法以定义以后(最新)版本的版本号。 当不应用任何迁徙时,第一个版本始终为1。只有执行不带迁徙代码就无奈向后兼容的更改,请减少此版本号。应用transform办法将旧的JSON构造转换为新的JSON构造。 JsonNode是可变的,因而您能够增加和删除字段,或更改值。 请留神,您必须转换为特定的子类,例如ObjectNode和ArrayNode能力拜访更改器。迁徙类必须在配置文件中定义:
note字段可能也做同样的事件,在ItemAddedMigration中增加默认值“”。## 重命名字段假如咱们要在上一个示例中将productId字段重命名为itemId。
迁徙代码如下:
## 构造变动以相似的形式,咱们能够进行任意的构造更改。旧类:
新类
Address 类
迁徙代码如下:
## 重命名类也能够重命名该类。 例如,让咱们将OrderAdded重命名为OrderPlaced。旧类:
新类
迁徙代码如下:
请留神,重写transformClassName办法,定义新的类名称。必须应用旧的类名作为键来配置这种类型的迁徙。能够删除理论的类。
## 从序列化绑定中删除当某个类不再用于序列化时,能够将其从序列化绑定中删除,但仍要容许反序列化,则必须在allowed-class-prefix配置中列出该类。例如,在通过序列化更改进行滚动更新期间,或在读取旧的存储数据时,此性能很有用。从Jackson序列化程序更改为另一个序列化程序(例如Protobuf)从而更改序列化绑定时,也能够应用它,然而依然能够应用Jackson来反序列化旧数据。
这是类名称或类名称前缀的列表。# Jackson模块默认状况下,以下Jackson模块是启用的:
您能够批改配置akka.serialization.jackson.jackson-modules以启用其余模块。ParameterNamesModule要求启用-parameters Java编译器选项。## 压缩JSON可能很简短,对于大型音讯,压缩大型无效负载可能会有所帮忙。 对于jackson-json绑定,默认配置为:
反对的压缩算法为:gzip,lz4。应用“敞开”禁用压缩。 Gzip通常比lz4慢。大于compress-larger-than属性的音讯将被压缩。能够通过将算法属性设置为敞开来禁用压缩。它依然可能解压缩序列化时压缩的有效载荷,例如如果更改此配置。对于杰克逊cbor和自定义绑定,默认状况下禁用杰克逊json压缩,但能够采纳与上述配置雷同的形式启用,但用绑定名称替换杰克逊json(例如杰克逊cbor)。附加配置每个绑定的配置默认状况下,在akka.serialization.jackson局部中定义了Jackson序列化程序及其ObjectMappers的配置。能够在更特定的akka.serialization.jackson。<binding name>局部中笼罩该配置。akka.serialization.jackson.jackson-json {  序列化性能{    WRITE_DATES_AS_TIMESTAMPS =敞开  }}akka.serialization.jackson.jackson-cbor {  序列化性能{    WRITE_DATES_AS_TIMESTAMPS =开启  }}也能够定义多个绑定并为它们应用不同的配置。例如,近程音讯和长久事件的不同设置。