4

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

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

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

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

4

1 回答 1

3
  • 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 序列化,而不是默认的序列化,你应该使用SerializerBasedActorFormattrait

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 对象的序列化,无需额外配置(在大多数情况下就足够了)。如果您需要忽略某些属性,或定义嵌入对象的序列化策略,请阅读

在你的情况下,你需要类似的东西

@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, 如果消息是用 , 发送的!, 或self.senderFuture, 当消息是用!!or发送的!!!。ActorRef(或RemoteActorRef)本身只是一个actor的抽象接口,用于封装内部actor的实现并让外部仅通过消息与actor通信(与stdlib Actors相反/很像在Erlang [进程]中所做的)和保存非常少量的数据,这些数据对于序列化和通过线路发送是有意义的。
于 2010-11-23T16:49:59.157 回答