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

时间:2017-04-27 21:51:00

标签: scala serialization 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
  }
}

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

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类)。

我做错了什么?

0 个答案:

没有答案