Сериалы-привязки акки тоже ограничены?

Возможно ли дополнительно квалифицировать сериализацию-привязки? Тип времени выполнения кажется слишком ограниченным.

например, у меня есть

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] (даже в разных актерах!), потому что их имя класса времени выполнения равно (PersistentExecutorProtocol$ToDo).

Я что-то пропустил? -Введение AProtocolClass или делая PersistentExecutorProtocol abstract class не помогает

1 ответ

Это не специфический Akka, а результат того, что концепции в Scala (пути-зависимые типы) не отображают 1:1 с тем, что может сделать JVM. Компилятору Scala необходимо кодировать такие концепции таким образом, чтобы JVM могла их понять, что может привести к потере информации (как, например, при стирании типа).

Выбор сериализатора на основе объекта происходит во время выполнения, и в этот момент информация, доступная до того, как компилятор выполнит свою работу, теряется, и остается доступной только информация, специфичная для JVM.

Вы могли бы, возможно, найти способ обойти это с ClassTagи т. д., но наименьший риск будущего горя, вероятно, состоит в том, чтобы объявить тодо абстрактным и иметь конкретные подтипы внутри конкретных экземпляров протокола, которые позволят вам связать различные сериализаторы с типами.

Вы можете выбрать один из способов сделать это здесь: https://gist.github.com/johanandren/87fec0b627996a3f850513b81e0a8d66

Другие вопросы по тегам