如何追踪Akka序列化失败的根本原因?

时间:2018-05-24 06:57:04

标签: akka

从Akka获取序列化错误,如下所示,如何回绕Akka消息的违规非序列化成员/字段?该异常确定了可以序列化的成员值(在com.our.member.object下面),但该对象本身包含许多嵌套成员,并且错误消息似乎对可以&#的有问题的嵌套对象提供了一些线索。 39;序列化:

  

2018-05-24T06:30:51.897Z错误VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter - 无法使用序列化程序[class akka]序列化远程消息[class akka.actor.ActorSelectionMessage]。 remote.serialization.MessageContainerSerializer。瞬态关联错误(关联保持活动)akka.remote.MessageSerializer $ SerializationException:无法使用序列化程序[class akka.remote.serialization.MessageContainerSerializer]序列化远程消息[class akka.actor.ActorSelectionMessage]。在akka.remote.MessageSerializer $ .serialize(MessageSerializer.scala:62)。在akka.remote.EndpointWriter $ $ anonfun serializeMessage $ 1(Endpoint.scala:895)在scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)在akka.remote.EndpointWriter.serializeMessage(Endpoint.scala:895)在akka.remote.EndpointWriter.writeSend(Endpoint.scala:786)在akka.remote.EndpointWriter $$ anonfun $ 4.applyOrElse(Endpoint.scala:761)在akka.actor.Actor.aroundReceive(Actor.scala:513)at akka.actor.Actor.aroundReceive $(Actor.scala:511)at akka.remor.EndpointActor.aroundReceive(Endpoint.scala:452)at akka.actor。 ActorCell.receiveMessage(ActorCell.scala:519)在akka.actor.ActorCell.invoke(ActorCell.scala:488)在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)在akka.dispatch.Mailbox.run(邮箱.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)引起:java.io.NotSerializableException:com.our.member.object在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)在java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)在java.io. java.io.ObjectOutputStream.writeSield上的java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)中的java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)中的ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432),ObjectOutputStream的.java:1509)在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)在akka.serializati在scala.util.DynamicVariable.withValue上的scala.runtime.java8.JFunction0 $ mcV $ sp.apply(JFunction0 $ mcV $ sp.java:12)上的on.JavaSerializer。$ anonfun $ toBinary $ 1(Serializer.scala:313) DynamicVariable.scala:58)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)在akka.remote.MessageSerializer $ .serialize(MessageSerializer.scala:47)...省略了17个常见帧

2 个答案:

答案 0 :(得分:1)

我今天遇到此错误,此错误的原因是忘记在消息类中添加“可序列化的实现”。错误消息和堆栈跟踪对于帮助我实现这一目标绝对没有用。

答案 1 :(得分:0)

从您的消息中看起来您正在使用JavaSerialization(在Akka中默认但在生产中非常不鼓励)。

Akka只知道您要序列化的顶级对象,然后由序列化程序提供一个好的错误消息。在这种情况下,JavaSerializatuoin通常会为您提供无法序列化的特定内容,并且您可以添加实现Serializable,直到它工作。

我建议你在演员系统之间进行远程通信,转而使用protobuf。