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