好的,所以我正在使用SJSON为scala中的case类编写隐式转换,以使用akka框架向远程actor发送消息。其中一个案例类看起来像这样
case class Example(id: String, actr: ActorRef)
我将如何编写此案例类的隐式。
我已经看到ActorRef确实有一个toBinary方法,但我需要将它发送到json
答案 0 :(得分:3)
/** * 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
}
self.sender
,如果消息是!
发送的,或self.senderFuture
,则发送消息时使用!!
或!!!
。 ActorRef(或RemoteActorRef)本身只是一个actor的抽象接口,用于封装内部actor的实现,并允许外部仅通过消息与actor通信(与stdlib Actors相比,就像它在Erlang [processes]中完成的那样)和保存非常少量的数据,这些数据对于序列化和通过线路发送是有意义的。