繁体   English   中英

是否可以将以我自己的类键入的消息发送给Akka远程角色?

[英]Is there a way to send messages typed with my own classes to an Akka remote actor?

有没有一种方法可以将以我自己的类键入的消息发送给远程参与者?
例如,我希望能够在我的远程角色中收到如下消息:

case myClass: MyClass => doSomething()

但是我收到一个错误的local class incompatible的错误,因为serialVersionUID是不同的。

我发现发送MyClass类型消息的唯一方法是在Json中序列化它。 但是我必须对其进行序列化/反序列化,而且更麻烦的是,我没有一种干净的方法来接收两种类型的消息...

那么,有没有一种方法可以向远程角色发送强类型消息? 如果没有,解决方法是什么?

您当然可以!

通过网络发送对象时,必须在一端将其转换为字节,然后在另一端将其转换为对象。 这称为“序列化”。

在Akka中,用于从一个参与者系统传播到另一个参与者系统的消息的序列化机制是高度可配置的:您不应该在自己的参与者中进行序列化,而应将其留给Akka的序列化基础结构(并根据自己的喜好进行配置)。

默认情况下,akka使用内置的“ Java序列化”。 这在大多数情况下都是有效的,但是正如您所注意到的,在连接的两面都具有完全相同的类是非常挑剔的。 而且,它不是特别快。 您应该在日志记录中看到警告:

对于类[{}]使用默认的Java序列化程序,由于性能问题,不建议使用。 使用其他序列化程序或使用设置akka.actor.warn-about-java-serializer-usage禁用此警告

要解决您的问题,您可以:

  • 继续使用Java序列化,并至少按照Vitaliy的答案中所述固定serialVersionUID
  • 切换到另一个序列化机制,例如Protobuf。

如果您不太在乎性能,并且不希望进行“滚动升级”(可能需要在同一条消息的不同版本之间进行转换),那么Java序列化无疑是最简单的。 不过,重要的是要意识到它的局限性。

有关如何配置Akka序列化机制的更多文档,请参见http://doc.akka.io/docs/akka/current/scala/serialization.html#serialization-scala

Serializable javadoc

强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类详细信息高度敏感,而类详细信息可能会根据编译器的实现而有所不同,因此可能在反序列化期间导致意外的InvalidClassExceptions。

因此,您应该在您的消息类中定义serialVersionUID ,如下所示:

@SerialVersionUID(42L)
class Message extends Serializable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM