2010-11-23 98 views
3

好吧,我正在编写scala中的case类的隐式转换,使用SJSON向使用akka框架的远程演员发送消息。其中一个案例分类看起来像这样发送一个Akka演员参考json

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

我该如何去写这种情况下的隐式类。

我看到ActorRefs确实有toBinary方法,但我需要把它的toJSON

回答

3
  • http://doc.akkasource.org/serialization-scala。当底层的actor实例(在ActorRef/RemoteActorRef下)存放一些重要的运行时数据时,只有有状态的actor可能需要显式[深]序列化。对于这种情况,你应该实现以下类型类为您的演员:
/** 
* 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 
} 
  • 一般情况下,你并不需要明确你的序列化类的情况下,当你在阿卡将消息发送到远程的演员 - 阿卡它本身在通过TCP发送之前用protobufs序列化所有数据。
  • 为什么你需要对演员的序列化引用?如果只需要接收邮件的参与者致电发件人,则只需使用self.sender(如果邮件使用!self.senderFuture发送,而邮件使用!!!!!发送)。 ActorRef(或RemoteActorRef)本身就是一个到actor的抽象接口,用于封装内部actor的实现,并让外部通过消息只与消息通信(与stdlib Actors形成对比,就像在Erlang [processes]中完成的那样)和只保存非常少量的数据,这些数据对序列化和通过线路发送而言是有意义的。
+0

非常感谢您的帮助。如果这适用于从密封特征继承的案例类,那么你是否碰巧知道? – trjohn06 2010-11-23 19:59:33