2016-05-14 57 views
1

有没有办法将使用我自己的类输入的消息发送给远程参与者?
比如我想能够在我的远程演员收到类似这样的消息:有没有办法将使用我自己的类型输入的消息发送给Akka远程演员?

case myClass: MyClass => doSomething() 

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

发送我找到的MyClass类型的消息的唯一方法是在Json中序列化它。但我必须序列化/反序列化它,并且更有问题,我没有一个干净的方式来接收两种类型的消息...

那么有没有办法将强类型消息发送到远程actor?如果没有,解决方法是什么?

+0

发现它看起来像你有你的角色的类路径2个不同的版本。检查类路径并定义'serialVersionUUID'的显式值' –

+0

“通过强类型我的意思是用我自己的类键入” - 您可能应该改写,因为这不是对其他人的意义 –

+0

@ChrisMartin这将是什么名称? – Simon

回答

6

你肯定可以!

当通过网络发送对象时,它们必须在一端变为字节,并在另一端转回到对象。这被称为“序列化”。

在Akka中,用于从一个角色系统到另一个角色的消息的序列化机制具有高度可配置性:您不应该在您自己的角色中执行此操作,而应将其留给Akka的序列化基础结构(并根据您的喜好进行配置) 。

默认情况下akka使用内置的“Java序列化”。这主要是有效的,但正如你注意到的那样,在连接的两端都有完全相同的类别时,会非常挑剔。而且,它并不是特别快。您应该在日志记录中看到一条警告:

由于性能影响,建议使用不是 的类[{}]的默认Java序列化程序。使用另一个 串行或使用设置 akka.actor.warn-有关Java的串使用率

禁用此警告解决您的问题,您可以:

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

如果你不关心性能,也不希望做'滚动升级'(你可能需要在不同版本的消息之间进行转换),Java序列化肯定是最简单的。不过,了解其局限性很重要。

如何配置阿卡的序列化机制的更多文档,http://doc.akka.io/docs/akka/current/scala/serialization.html#serialization-scala

1

Serializablejavadoc

强烈建议所有可序列化类中明确 申报的serialVersionUID值,因为默认的serialVersionUID 计算是类的细节可能取决于编译器的实现而不同 高度敏感,在反序列化期间可能会导致 意外的InvalidClassExceptions。

所以,你应该定义你的消息类serialVersionUID这样的:

@SerialVersionUID(42L) 
class Message extends Serializable 
相关问题