さて、私はSJSONを使用して、scalaのケースクラスの暗黙的な変換を記述し、akkaフレームワークを使用してリモートアクターにメッセージを送信しています。ケースクラスの1つは次のようになります
case class Example(id: String, actr: ActorRef)
このケースクラスの暗黙的な記述をどのように行えばよいでしょうか。
ActorRefsにはtoBinaryメソッドがあるのを見ましたが、それをJsonに送信する必要があります
/** * 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
}
self.sender
メッセージが送信された場合は、を使用できます。ActorRef(またはRemoteActorRef)自体は、アクターへの単なる抽象的なインターフェイスであり、内部アクターの実装をカプセル化し、外部がメッセージを介してのみアクターと通信できるようにするために使用されます(stdlibアクターとは対照的に/ Erlang [プロセス]で行われるように)シリアル化して有線で送信するのに意味のある非常に少量のデータを保持します。!
self.senderFuture
!!
!!!