Scala 有没有一种方法可以将用我自己的类键入的消息发送给Akka远程参与者?

Scala 有没有一种方法可以将用我自己的类键入的消息发送给Akka远程参与者?,scala,akka,akka-remote-actor,Scala,Akka,Akka Remote Actor,有没有办法将用我自己的类键入的消息发送给远程参与者? 例如,我希望能够在我的remote actor中收到如下消息: case myClass: MyClass => doSomething() @SerialVersionUID(42L) class Message extends Serializable 但是我得到一个错误,本地类不兼容,因为serialVersionUID不同 我发现发送MyClass类型消息的唯一方法是用Json序列化它。但是我必须对它进行序列化/反序列化,更

有没有办法将用我自己的类键入的消息发送给远程参与者? 例如,我希望能够在我的remote actor中收到如下消息:

case myClass: MyClass => doSomething()
@SerialVersionUID(42L)
class Message extends Serializable
但是我得到一个错误,本地类不兼容,因为serialVersionUID不同

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

那么,有没有一种方法可以将强类型消息发送给远程参与者呢?如果没有,解决方法是什么?

来自Serializable:

强烈建议所有可序列化类都显式 声明SerialVersionId值,因为默认SerialVersionId 计算对可能变化的类细节非常敏感 取决于编译器实现,因此可能导致 反序列化期间出现意外的InvalidClassException

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

case myClass: MyClass => doSomething()
@SerialVersionUID(42L)
class Message extends Serializable
从可序列化:

强烈建议所有可序列化类都显式 声明SerialVersionId值,因为默认SerialVersionId 计算对可能变化的类细节非常敏感 取决于编译器实现,因此可能导致 反序列化期间出现意外的InvalidClassException

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

case myClass: MyClass => doSomething()
@SerialVersionUID(42L)
class Message extends Serializable

你当然可以

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

在Akka中,用于消息从一个参与者系统传输到另一个参与者系统的序列化机制是高度可配置的:您不应该在您自己的参与者中执行此操作,而是让Akka的序列化基础结构来完成,并根据您的喜好进行配置

默认情况下,akka使用内置的“Java序列化”。这基本上是可行的,但正如您所注意到的,在连接的两侧都有完全相同的类,这是相当挑剔的。而且,速度也不是特别快。您应该在日志记录中看到警告:

使用类[{}]的默认Java序列化程序,该类不是 由于性能影响,建议使用。使用另一个 序列化程序或使用设置禁用此警告 akka.actor.warn-about-java-serializer-usage

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

继续使用Java序列化,至少修复serialVersionUID,如Vitaliy的回答中所述。 切换到另一种序列化机制,如Protobuf。 如果您不太关心性能,也不希望进行可能需要在同一消息的不同版本之间转换的“滚动升级”,那么Java序列化肯定是最简单的。不过,重要的是要意识到它的局限性


有关如何配置akka序列化机制的更多文档,请访问

,当然可以

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

在Akka中,用于消息从一个参与者系统传输到另一个参与者系统的序列化机制是高度可配置的:您不应该在您自己的参与者中执行此操作,而是让Akka的序列化基础结构来完成,并根据您的喜好进行配置

默认情况下,akka使用内置的“Java序列化”。这基本上是可行的,但正如您所注意到的,在连接的两侧都有完全相同的类,这是相当挑剔的。而且,速度也不是特别快。您应该在日志记录中看到警告:

使用类[{}]的默认Java序列化程序,该类不是 由于性能影响,建议使用。使用另一个 序列化程序或使用设置禁用此警告 akka.actor.warn-about-java-serializer-usage

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

继续使用Java序列化,至少修复serialVersionUID,如Vitaliy的回答中所述。 切换到另一种序列化机制,如Protobuf。 如果您不太关心性能,也不希望进行可能需要在同一消息的不同版本之间转换的“滚动升级”,那么Java序列化肯定是最简单的。不过,重要的是要意识到它的局限性


有关如何配置akka序列化机制的更多文档,请访问

,您的参与者的类路径中似乎有两个不同的版本。检查类路径并通过强类型定义SerialVersionUIDBY的显式值我的意思是使用我自己的类进行类型化-您可能应该重新措辞,因为这对任何人来说都不是什么意思else@ChrisMartin这个的正确名称是什么?我不认为是
这是真的。在JVM上,您的类和其他类之间没有这样的区别。至于字面上的问题:,但这仍然是实验性的。看起来您的参与者的类路径中有两个不同的版本。检查类路径并通过强类型定义SerialVersionUIDBY的显式值我的意思是使用我自己的类进行类型化-您可能应该重新措辞,因为这对任何人来说都不是什么意思else@ChrisMartin这个的正确名称是什么?我不认为它是真的。在JVM上,您的类和其他类之间没有这样的区别。至于字面上的问题:,但这仍然是实验性的。