4

さて、私はSJSONを使用して、scalaのケースクラスの暗黙的な変換を記述し、akkaフレームワークを使用してリモートアクターにメッセージを送信しています。ケースクラスの1つは次のようになります

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

このケースクラスの暗黙的な記述をどのように行えばよいでしょうか。

ActorRefsにはtoBinaryメソッドがあるのを見ましたが、それをJsonに送信する必要があります

4

1 に答える 1

3
  • 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
}
  • 一般に、Akkaのリモートアクターにメッセージを送信する場合、ケースクラスを明示的にシリアル化する必要はありません。Akka自体は、TCPを介して送信する前に、すべてのデータをprotobufsでシリアル化します。
  • アクターへの参照をシリアル化する必要があるのはなぜですか?メッセージを受信するアクターが送信者に電話をかける必要がある場合は、メッセージが、で送信された場合は、、またはでself.senderメッセージが送信された場合は、を使用できます。ActorRef(またはRemoteActorRef)自体は、アクターへの単なる抽象的なインターフェイスであり、内部アクターの実装をカプセル化し、外部がメッセージを介してのみアクターと通信できるようにするために使用されます(stdlibアクターとは対照的に/ Erlang [プロセス]で行われるように)シリアル化して有線で送信するのに意味のある非常に少量のデータを保持します。!self.senderFuture!!!!!
于 2010-11-23T16:49:59.157 に答える