将Akka actorRef发送给json

时间:2010-11-23 16:20:32

标签: json scala akka

好的,所以我正在使用SJSON为scala中的case类编写隐式转换,以使用akka框架向远程actor发送消息。其中一个案例类看起来像这样

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

我将如何编写此案例类的隐式。

我已经看到ActorRef确实有一个toBinary方法,但我需要将它发送到json

1 个答案:

答案 0 :(得分:3)

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