是否有可能进一步鉴定序列化结合?运行时类型似乎太有限了。
例如。我有
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[OtherPayload]
不同的序列化序列化ToDo[MyPayload]
(甚至在不同的演员中!(,因为它们的运行时类名称相等(PersistentExecutorProtocol$ToDo
(。
我想念什么吗? - 介绍AProtocolClass
或制作PersistentExecutorProtocol
abstract class
无济于事。
这不是特定的AKKA,而是Scala(路径依赖类型(中的概念如何与JVM可以做什么的结果。Scala编译器需要以JVM可以理解的方式编码此类概念,这可能会导致信息丢失(例如,删除类型(。
选择基于对象的序列化器发生在运行时发生,到那时,编译器完成作业之前可用的信息丢失了,并且只有JVM特定信息仍然可用。
您可能可以使用ClassTag
S等来解决此问题。但是,将来悲伤的最小风险可能是声明Todo抽象,并在具体协议实例中具有混凝土子类型,这将使您可以将不同的串行器绑定到不同类型。
您可以在此处执行一种方法:https://gist.github.com/johanandren/87fec0b627996a3f850513b81e0a8d66