我有一个实现它的特征和案例对象
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
}
}
我希望能够序列化它们。使用以下序列化配置
serializers {
cowboySerializer = "mypackage.CowboySerializer"
}
serialization-bindings {
"mypackage.Cowboy" = cowboySerializer
}
我收到了这个警告:
找到类mypackage.Cowboy $ Ugly $的多个序列化程序,选择 第一个:矢量((界面 java.io.Serializable接口,akka.serialization.JavaSerializer @ 3fee36d8) (接口 mypackage.Cowboy,brigadier.scraper.ScrapeStatusSerializer @ 10442350))
这意味着选择java序列化程序而不是我的。
如果我通过
禁用java序列化程序akka.actor.serialization-bindings {
"java.io.Serializable" = none
}
发生以下错误:
使用序列拒绝持久化事件类型[mypackage.Cowboy $ Ugly $] 由于[mypackage.Cowboy $ Ugly $,因此persistenceId [XXX]为1 无法投射到mypackage.Cowboy]
这对我来说似乎很奇怪,因为施放
Cowboy.Ugly.asInstanceOf[Cowboy]
显然有效。
我还尝试将每个案例对象映射到序列化器,Akka docs说
如果您的消息包含在Scala对象中,则按顺序 要引用这些消息,您需要使用完全限定的消息 Java类名。对于包含在其中的名为Message的消息 对象名为Wrapper,您需要将其引用为Wrapper $ Message 而不是Wrapper.Message。
serialization-bindings {
"mypackage.Cowboy$Good" = cowboySerializer
"mypackage.Cowboy$Bad" = cowboySerializer
"mypackage.Cowboy$Ugly" = cowboySerializer
}
并且得到了由ClassNotFoundException引起的InvocationTargetException引起的ActorInitializationException(无法找到mypackage.Cowboy $ Ugly类)。
我做错了什么?