是否有可能进一步限定序列化绑定? 运行时类型似乎太有限了。
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
无法提供帮助。
答案 0 :(得分:0)
这不是特定的Akka,而是Scala中的概念(路径依赖类型)不会将1:1映射到JVM可以执行的操作的结果。 Scala编译器需要以JVM可以理解的方式对这些概念进行编码,这会导致信息丢失(例如,与类型擦除一样)。
在运行时选择基于对象的序列化程序,此时编译器完成其工作之前可用的信息将丢失,并且只有JVM特定信息仍然可用。
你可以用ClassTag
等来解决这个问题,但是未来悲伤的风险最小可能是宣告Todo摘要并在具体协议实例中具有具体的子类型,这将允许你将不同的序列化程序绑定到类型。
您可以在此处选择一种方式:https://gist.github.com/johanandren/87fec0b627996a3f850513b81e0a8d66