2010-11-23 100 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