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

如何跟踪Akka序列化失败的根本原因?,akka,Akka,从Akka获取序列化错误,如下所示,如何处理Akka消息中有问题的不可序列化成员/字段?异常确实命名了无法序列化的成员值(在com.our.member.object下面),但该对象本身包含许多嵌套成员,并且错误消息似乎对无法序列化的有问题的嵌套对象没有什么线索: 2018-05-24T06:30:51.897Z错误VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter-无法使用序列化程序[class-akka.remote.

从Akka获取序列化错误,如下所示,如何处理Akka消息中有问题的不可序列化成员/字段?异常确实命名了无法序列化的成员值(在
com.our.member.object
下面),但该对象本身包含许多嵌套成员,并且错误消息似乎对无法序列化的有问题的嵌套对象没有什么线索:

2018-05-24T06:30:51.897Z错误VCA-akka.actor.default-dispatcher-4 akka.remote.EndpointWriter-无法使用序列化程序[class-akka.remote.serialization.MessageContainerSerializer]序列化远程消息[class-akka.actor.actorSelectMessage]。暂时关联错误(关联仍然有效)akka.remote.MessageSerializer$SerializationException:无法使用序列化程序[class akka.remote.serialization.MessageContainerSerializer]序列化远程消息[class akka.actor.ActorSelectMessage]。akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:62)和akka.remote.EndpointWriter.writeSend(Endpoint.scala:786)的$anonfun$serializeMessage$1(Endpoint.scala:895)和akka.util.DynamicVariable.withValue(DynamicVariable.scala:58)akka.actor.actor.aroundReceive(actor.scala:513)的akka.actor.actor.aroundReceive(actor.scala:513)的akka.actor.actor.aroundReceive$(actor.scala:511)的akka.remote.EndpointActor.aroundReceive(Endpoint.scala:452)的akka.actor.actor.ActorCell.receiveMessage(ActorCell.scala:519)的akka.actor.actor.actor.actor.ActorCell.actiorcell.invoke在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257)在akka.dispatch.Mailbox.run(Mailbox.scala:224)在akka.dispatch.Mailbox.exec(Mailbox.scala:234)在akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)在akka.dispatch.forkjoin.ForkJoinPool.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)运行在akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)在akka.dispatch.forkjoinjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)由以下原因引起:java.io.notserializableeexception:com.our.member.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)在java.io.ObjectOutputStream.defaultWriteFields在java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)在java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)在java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)在java.io.ObjectOutputStream.DefaultWriteFieldFS(ObjectOutputStream.java:1548)上在java.io.ObjectOutputStream.writeSerialData(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.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)的scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)的akka.serialization.JavaSerializer在akka.remote.serialization.MessageContainerSerializer.serializeSelection(MessageContainerSerializer.scala:37)在akka.remote.serialization.MessageContainerSerializer.toBinary(MessageContainerSerializer.scala:26)在akka.remote.MessageSerializer$.serialize(MessageSerializer.scala:47)中省略17个公共帧


从您的消息来看,您似乎正在使用JavaSerialization(Akka中的默认设置,但对于生产环境来说非常不推荐)

Akka只知道要序列化的顶级对象,然后由序列化程序给出一个好的错误消息。在这种情况下,JavaSerializationUin通常会给出它无法序列化的特定内容,并且在它工作之前添加可序列化的实现


我建议在actor系统之间进行远程通信时使用protobuf之类的工具。

从您的消息中可以看出,您正在使用JavaSerialization(Akka中的默认值,但对于生产环境来说,这是非常不鼓励的)

Akka只知道要序列化的顶级对象,然后由序列化程序给出一个好的错误消息。在这种情况下,JavaSerializationUin通常会给出它无法序列化的特定内容,并且在它工作之前添加可序列化的实现


我建议在actor系统之间进行远程通信时使用protobuf之类的工具。

我今天遇到了这个错误,导致这个错误的原因是忘记添加“implements Serializable”到message类。错误消息和堆栈跟踪对于帮助我实现这一点毫无用处。

我今天收到此错误,导致此错误的原因是忘记将“implements Serializable”添加到message类。错误消息和堆栈跟踪对于帮助我实现这一点毫无用处