如何使用akka自定义序列化序列化内部案例对象?

Jer*_*iho 6 serialization scala akka

我有一个实现它的特征和案例对象

trait Cowboy {
  def code: String
}

object Cowboy {
  case object Good extends Cowboy {
    val code = "G"
  }
  case object Bad extends Cowboy {
    val code = "B"
  }

  case object Ugly extends Cowboy {
    val code = "U"
  }

  def fromString(code: String) = code match {
    case Good.code => Good
    case Bad.code => Bad
    case Ugly.code => Ugly
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够序列化它们.使用以下序列化配置

serializers {
  cowboySerializer = "mypackage.CowboySerializer"
}

serialization-bindings {
  "mypackage.Cowboy" = cowboySerializer
}
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

为mypackage.Cowboy $ Ugly $找到多个序列化器,首先选择:Vector((接口java.io.Serializable,akka.serialization.JavaSerializer @ 3fee36d8),(接口mypackage.Cowboy,brigadier.scraper.ScrapeStatusSerializer @ 10442350))

这意味着选择java序列化程序而不是我的.

如果我通过禁用java序列化程序

akka.actor.serialization-bindings {
  "java.io.Serializable" = none
}
Run Code Online (Sandbox Code Playgroud)

发生以下错误:

由于[mypackage.Cowboy $ Ugly $无法强制转换为mypackage.Cowboy],因为persistenceId [XXX] 拒绝持续事件类型[mypackage.Cowboy $ Ugly $],序列号为1

这对我来说似乎很奇怪因为施法

Cowboy.Ugly.asInstanceOf[Cowboy]
Run Code Online (Sandbox Code Playgroud)

显然有效.

我也尝试将每个案例对象映射到序列化器,正如Akka docs所说

如果您的消息包含在Scala对象中,那么为了引用这些消息,您将需要使用完全限定的Java类名.对于名为Wrapper的对象中包含的名为Message的消息,您需要将其引用为Wrapper $ Message而不是Wrapper.Message.

serialization-bindings {
  "mypackage.Cowboy$Good" = cowboySerializer
  "mypackage.Cowboy$Bad" = cowboySerializer
  "mypackage.Cowboy$Ugly" = cowboySerializer
}
Run Code Online (Sandbox Code Playgroud)

并且得到了由ClassNotFoundException引起的InvocationTargetException引起的ActorInitializationException(无法找到mypackage.Cowboy $ Ugly类).

我究竟做错了什么?