好的,所以我正在使用 SJSON 为 scala 中的案例类编写隐式转换,以使用 akka 框架向远程参与者发送消息。其中一个案例类如下所示
case class Example(id: String, actr: ActorRef)
我将如何为这个案例类编写隐式。
我已经看到 ActorRefs 确实有一个 toBinary 方法,但我需要将它发送到 Json
/** * 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 对象的序列化,无需额外配置(在大多数情况下就足够了)。如果您需要忽略某些属性,或定义嵌入对象的序列化策略,请阅读此。
在你的情况下,你需要类似的东西
@BeanInfo
case class Example(id: String,
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef)
implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
val serializer = Serializer.ScalaJSON
}
self.sender
, 如果消息是用 , 发送的!
, 或self.senderFuture
, 当消息是用!!
or发送的!!!
。ActorRef(或RemoteActorRef)本身只是一个actor的抽象接口,用于封装内部actor的实现并让外部仅通过消息与actor通信(与stdlib Actors相反/很像在Erlang [进程]中所做的)和保存非常少量的数据,这些数据对于序列化和通过线路发送是有意义的。