3
好吧,我正在編寫scala中的case類的隱式轉換,使用SJSON向使用akka框架的遠程演員發送消息。其中一個案例分類看起來像這樣發送一個Akka演員參考json
case class Example(id: String, actr: ActorRef)
我該如何去寫這種情況下的隱式類。
我看到ActorRefs確實有toBinary方法,但我需要把它的toJSON
好吧,我正在編寫scala中的case類的隱式轉換,使用SJSON向使用akka框架的遠程演員發送消息。其中一個案例分類看起來像這樣發送一個Akka演員參考json
case class Example(id: String, actr: ActorRef)
我該如何去寫這種情況下的隱式類。
我看到ActorRefs確實有toBinary方法,但我需要把它的toJSON
/** * 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對象,無需額外配置(在大多數情況下,這足夠了)。如果您需要忽略某些屬性或定義嵌入對象的序列化策略,請參閱this。
在你的情況,你會需要像
@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
(如果郵件使用!
或self.senderFuture
發送,而郵件使用!!
或!!!
發送)。 ActorRef(或RemoteActorRef)本身就是一個到actor的抽象接口,用於封裝內部actor的實現,並讓外部通過消息只與消息通信(與stdlib Actors形成對比,就像在Erlang [processes]中完成的那樣)和只保存非常少量的數據,這些數據對序列化和通過線路發送而言是有意義的。
非常感謝您的幫助。如果這適用於從密封特徵繼承的案例類,那麼你是否碰巧知道? – trjohn06 2010-11-23 19:59:33