关于akka:Serialization-with-Jackson

8次阅读

共计 3394 个字符,预计需要花费 9 分钟才能阅读完成。

# 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 = 开启}
}
也能够定义多个绑定并为它们应用不同的配置。例如,近程音讯和长久事件的不同设置。
正文完
 0