How to serialize internal enclosure objects using akka custom serialization?

I have objects with traits and objects that implement it

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
  }
}

I want to be able to serialize them. With the following serialization configurations

serializers {
  cowboySerializer = "mypackage.CowboySerializer"
}

serialization-bindings {
  "mypackage.Cowboy" = cowboySerializer
}

I get this warning:

Several serializers were found for the mypackage.Cowboy $ Ugly $ class, choosing first: Vector ((java.io.Serializable interface, akka.serialization.JavaSerializer @ 3fee36d8), (mypackage.Cowboy interface, brigadier.scraper.ScrapeStatusSerializer @ 10442350))

which means java serializer is selected instead of mine.

If I disable java serializer via

akka.actor.serialization-bindings {
  "java.io.Serializable" = none
}

the following error occurs:

[mypackage.Cowboy $Ugly $] 1 persistenceId [XXX] - [mypackage.Cowboy $Ugly $ 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
}

ActorInitializationException, InvocationTargetException, ClassNotFoundException ( mypackage.Cowboy $Ugly).

?

+4

Source: https://habr.com/ru/post/1675858/


All Articles