【问题标题】:Sending an Akka actorRef to json将 Akka actorRef 发送到 json
【发布时间】:2011-05-14 13:56:06
【问题描述】:

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

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

我将如何为这个案例类编写隐式。

我看到 ActorRefs 确实有一个 toBinary 方法,但我需要将它发送到Json

【问题讨论】:

    标签: json scala akka


    【解决方案1】:
    • http://doc.akkasource.org/serialization-scala 。当底层actor实例(在ActorRef / RemoteActorRef下)持有一些重要的运行时数据时,可能仅对有状态的actors需要显式[深度]序列化。对于这种情况,您应该为您的演员实现以下类型类:
    /**
     * 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

    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 中向远程参与者发送消息时,您不需要显式序列化您的案例类 - Akka 本身在通过 TCP 发送之前使用 protobuf 序列化所有数据。
    • 为什么需要对演员的序列化引用?如果只是需要接收消息的actor调用发送者,则可以简单地使用self.sender,如果消息是用!发送的,或者self.senderFuture,当消息是用!!或@发送时987654333@。 ActorRef(或RemoteActorRef)本身只是一个actor的抽象接口,用于封装内部actor的实现并让外部仅通过消息与actor通信(与stdlib Actors相反/很像在Erlang [processes]中所做的)和保存非常少量的数据,这些数据对于序列化和通过线路发送是有意义的。

    【讨论】:

    • 非常感谢您的帮助。您是否碰巧知道这是否适用于从密封特征继承的案例类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多