0
votes

Getting a serialization error from Akka, like follows, how do you wrap around the offending non-serializable member/field of your Akka message? The exception does name the member value that can't serialize (below com.our.member.object), but that object comprises many nested members itself, and the error message might seem to give little clue toward the offending nested object that can't be serialized:

2018-05-24T06:30:51.897Z ERROR VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter - Failed to serialize remote message [class akka.actor.ActorSelectionMessage] using serializer [class akka.remote.serialization.MessageContainerSerializer]. Transient association error (association remains live)akka.remote.MessageSerializer$SerializationException: Failed to serialize remote message [class akka.actor.ActorSelectionMessage] using serializer [class akka.remote.serialization.MessageContainerSerializer]. at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:62) at akka.remote.EndpointWriter.$anonfun$serializeMessage$1(Endpoint.scala:895) at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) at akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:895) at akka.remote.EndpointWriter.writeSend(Endpoint.scala:786) at akka.remote.EndpointWriter$$anonfun$4.applyOrElse(Endpoint.scala:761) at akka.actor.Actor.aroundReceive(Actor.scala:513) at akka.actor.Actor.aroundReceive$(Actor.scala:511) at akka.remote.EndpointActor.aroundReceive(Endpoint.scala:452) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:519) at akka.actor.ActorCell.invoke(ActorCell.scala:488) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) at akka.dispatch.Mailbox.run(Mailbox.scala:224) at akka.dispatch.Mailbox.exec(Mailbox.scala:234) at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)Caused by: java.io.NotSerializableException: com.our.member.object at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at akka.serialization.JavaSerializer.$anonfun$toBinary$1(Serializer.scala:313) at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58) at akka.serialization.JavaSerializer.toBinary(Serializer.scala:313) at akka.remote.serialization.MessageContainerSerializer.serializeSelection(MessageContainerSerializer.scala:37) at akka.remote.serialization.MessageContainerSerializer.toBinary(MessageContainerSerializer.scala:26) at akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:47) ... 17 common frames omitted

2

2 Answers

0
votes

From your message it looks like you are using JavaSerialization (default in Akka but highly discouraged for production).

Akka only knows about the top level object you're serializing, then it is up to the serializer to give a good error message. In this case JavaSerializatuoin usually gives you the specific thing it can't serialize and you add implements Serializable until it works.

I'd suggest moving to something like protobuf for your remote communication between actor systems.

2
votes

I got this error today, the cause of this error was forgeting to add "implements Serializable" to the message class. The error message and stack trace were absolutely useless regarding helping me to realize this.