持久化事件和在集群节点之间交换消息需要序列化。Lagom使用Akka序列化机制为通过网络发送的每条消息绑定序列化程序。Akka建议将基于Jackson的序列化程序(最好是JSON,但也支持CBOR)作为大多数情况下的良好默认值。在Akka序列化程序的基础上,Lagom可以轻松添加Play JSON序列化支持,这对一些Scala开发人员来说可能更熟悉。
通过不基于反射的序列化,可以避免运行时开销。与JSON之间的转换可以手动定义,也可以使用内置宏来定义——本质上是在编译时而不是在运行时进行反射。这有一个警告,可以序列化的每个顶级类都需要定义一个显式序列化器。
在Akka文档中Jackson序列化已经涵盖了一些基本概念,比如用法(设置绑定并创建标记特征)、模式演化,甚至还有其他配置和特性。
将一个类序列化和反序列化为JSON的类是一种Reads 和Writes结合的Format 。该库将JSON解析为JSON树模型,这就是Format
的工作原理。
Akka中的序列化限制
在Akka类型中,消息通常包括replyTo:ActorRef[T]
字段,以便处理消息的参与者可以发回消息。序列化ActorRef[T]
需要使用Akka-Jackson序列化程序。如果在Lagom中使用Akka类型的持久化,则必须使用Akka Jackson来序列化命令,因为发送到聚合的命令消息包含replyTo:ActorRef[MyReply]
字段。
Akka Jackson用于命令消息的限制不适用于其他消息,例如事件,甚至回复。Akka需要序列化的每种类型都可以使用不同的序列化程序。