Akka序列化绑定太有限了?

时间:2017-06-01 18:47:18

标签: scala akka akka-persistence akka-remote-actor akka-actor

是否有可能进一步限定序列化绑定? 运行时类型似乎太有限了。

e.g。我有

trait PersistentExecutorProtocol[Payload] extends Serializable {
  sealed trait Event extends Serializable
  case class ToDo(value: Payload) extends Event
  case class Done(value: Long) extends Event
}
object AProtocolInstance extends PersistentExecutorProtocol[MyPayload]
object BProtocolInstance extends PersistentExecutorProtocol[OtherPayload]

我现在无法使用与ToDo[MyPayload]不同的序列化程序序列化ToDo[OtherPayload](即使在不同的Actors中!),因为它们的运行时类名称相等(PersistentExecutorProtocol$ToDo)。

我错过了什么吗? - 引入AProtocolClass或使PersistentExecutorProtocol abstract class无法提供帮助。

1 个答案:

答案 0 :(得分:0)

这不是特定的Akka,而是Scala中的概念(路径依赖类型)不会将1:1映射到JVM可以执行的操作的结果。 Scala编译器需要以JVM可以理解的方式对这些概念进行编码,这会导致信息丢失(例如,与类型擦除一样)。

在运行时选择基于对象的序列化程序,此时编译器完成其工作之前可用的信息将丢失,并且只有JVM特定信息仍然可用。

你可以用ClassTag等来解决这个问题,但是未来悲伤的风险最小可能是宣告Todo摘要并在具体协议实例中具有具体的子类型,这将允许你将不同的序列化程序绑定到类型。

您可以在此处选择一种方式:https://gist.github.com/johanandren/87fec0b627996a3f850513b81e0a8d66