質問

わかりましたので、SJSONを使用してScalaのケースクラスの暗黙のコンバージョンを作成して、Akkaフレームワークを使用してリモートアクターにメッセージを送信しています。ケースクラスの1つはこのように見えます

case class Example(id: String, actr: ActorRef) 

このケースクラスの暗黙を書くにはどうすればよいですか。

ActorRefsにはトビナリメソッドがあることがわかりましたが、Tojsonを送信する必要があります

役に立ちましたか?

解決

  • http://doc.akkasource.org/serialization-scala 。基礎となる俳優インスタンス(ActorRef / RemoteactorRefの下)がいくつかの重要なランタイムデータを保持している場合、明示的な[深い]シリアル化は、ステートフルアクターにのみ必要になる場合があります。この場合、俳優に次のタイプクラスを実装する必要があります。
/**
 * Type class definition for Actor Serialization
 */
trait FromBinary[T <: Actor] {
  def fromBinary(bytes: Array[Byte], act: T): T
}

trait ToBinary[T <: Actor] {
  def toBinary(t: T): Array[Byte]
}

// client needs to implement Format[] for the respective actor
trait Format[T <: Actor] extends FromBinary[T] with ToBinary[T]

Scalajsonのシリアル化が必要な場合は、デフォルトのシリアル化の代わりに、使用する必要があります SerializerBasedActorFormat 特性

trait SerializerBasedActorFormat[T <: Actor] extends Format[T] {
  val serializer: Serializer
  def fromBinary(bytes: Array[Byte], act: T) = serializer.fromBinary(bytes, Some(act.self.actorClass)).asInstanceOf[T]
  def toBinary(ac: T) = serializer.toBinary(ac)
}

ScalaJSON serializer。 SJSONライブラリは、追加の構成なしで、普通のSCALAオブジェクトのシリアル化をサポートしています(ほとんどの場合、これで十分です)。いくつかのプロパティを無視する必要がある場合、または埋め込まれたオブジェクトのシリアル化ポリシーを定義する必要がある場合は、読む これ.

あなたの場合、あなたは次のようなものが必要です

@BeanInfo
case class Example(id: String, 
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef) 

implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
    val serializer = Serializer.ScalaJSON
}
  • 一般的に、TCPを送信する前にAkka自体をProtoBUFSですべてのデータをシリアル化するAkkaのリモートアクターにメッセージを送信する場合、ケースクラスを明示的にシリアル化する必要はありません。
  • 俳優への参照をシリアル化する必要があるのはなぜですか?メッセージを受け取る俳優によって送信者に電話する必要がある場合は、単に使用できます self.sender, 、メッセージが送信された場合 !, 、 また self.senderFuture, 、メッセージが送信されるとき !! また !!!. 。 ActorRef(またはRemoteactorRef)自体は、俳優への抽象的なインターフェイスであり、内部俳優の実装をカプセル化し、外部人がメッセージを介してのみ俳優と通信できるようにするために使用されます(Stdlib俳優とは対照的に / Erlang [プロセス]と同じように)シリアル化してワイヤーを送信するのが理にかなっている非常に少量のデータを保持します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top