1

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

例如我有

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没有帮助。

4

1 回答 1

0

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

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

您也许可以通过ClassTags 等找到解决此问题的方法,但未来悲痛的最小风险可能是声明 Todo 抽象并在具体协议实例中包含具体子类型,这将允许您将不同的序列化程序绑定到类型。

您可以在这里找到一种方法:https ://gist.github.com/johanandren/87fec0b627996a3f850513b81e0a8d66

于 2017-06-08T11:22:52.397 回答