将Akka actorRef发送到json

将Akka actorRef发送到json,json,scala,akka,Json,Scala,Akka,好的,我正在用SJSON为scala中的case类编写隐式转换,以使用akka框架向远程参与者发送消息。其中一个case类如下所示 case class Example(id: String, actr: ActorRef) 我将如何为这个案例类编写隐式 我已经看到ActorRefs确实有一个toBinary方法,但我需要将它发送到JSON 。当底层actor实例(在ActorRef/RemoteActorRef下)包含一些重要的运行时数据时,只有有状态的actor才需要显式[deep]序列

好的,我正在用SJSON为scala中的case类编写隐式转换,以使用akka框架向远程参与者发送消息。其中一个case类如下所示

case class Example(id: String, actr: ActorRef) 
我将如何为这个案例类编写隐式

我已经看到ActorRefs确实有一个toBinary方法,但我需要将它发送到JSON
  • 。当底层actor实例(在ActorRef/RemoteActorRef下)包含一些重要的运行时数据时,只有有状态的actor才需要显式[deep]序列化。对于这种情况,您应该为您的参与者实现以下typeclass:
  • 有。 SJSON库支持对普通Scala对象进行开箱即用的序列化,而无需额外配置(在大多数情况下,这就足够了)。如果需要忽略某些属性,或定义嵌入对象的序列化策略,请阅读

    在你的情况下,你需要

    @BeanInfo
    case class Example(id: String, 
    @(JSONTypeHint @field)(value = classOf[MyActor])
    actr: ActorRef) 
    
    implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
        val serializer = Serializer.ScalaJSON
    }
    
    • 一般来说,当您向Akka中的远程参与者发送消息时,不需要显式序列化您的案例类-Akka本身在通过TCP发送之前使用protobufs序列化所有数据
    • 为什么需要序列化对参与者的引用?如果接收消息的参与者只需要给发件人打电话,您只需使用
      self.sender
      ,如果消息是通过
      发送的一起发送时,code>或
      self.senderFuture
      。ActorRef(或RemoteActorRef)本身只是actor的抽象接口,用于封装内部actor的实现,并允许外部仅通过消息与actor通信(与stdlib Actors相反/很像在Erlang[进程]中完成的操作)并保存非常少量的数据,这些数据可以通过有线方式进行序列化和发送
      
    太棒了,谢谢你的帮助。您是否碰巧知道这是否适用于从密封特性继承的case类。
    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)
    }
    
    @BeanInfo
    case class Example(id: String, 
    @(JSONTypeHint @field)(value = classOf[MyActor])
    actr: ActorRef) 
    
    implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
        val serializer = Serializer.ScalaJSON
    }