2016-05-14 53 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 
相關問題