El envío de un actorRef Akka a JSON
Pregunta
Ok, así que estoy escribiendo conversiones implícitas para las clases de casos en Scala, utilizando SJSON, para enviar mensajes a los agentes remotos utilizando el marco akka. Una de las clases de caso es similar al siguiente
case class Example(id: String, actr: ActorRef)
¿Cómo hago para escribir la implícita para esta clase de caso.
he visto que ActorRefs tienen un método toBinary pero tengo que enviarlo toJson
Solución
- http://doc.akkasource.org/serialization-scala . Explícita serialización [profunda] puede ser requerido solamente para los actores de estado, cuando subyacente ejemplo actor (bajo ActorRef / RemoteActorRef) posee algunos datos de tiempo de ejecución importantes. Para este caso, se debe aplicar la siguiente clase de tipos para su agente:
/** * 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]
Si desea serialización ScalaJSON, en lugar de la que viene por defecto, se debe utilizar SerializerBasedActorFormat
rasgo
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)
}
con ScalaJSON serializer
.
SJSON soportes biblioteca de serialización de la llanura Scala objetos out-of-box, sin una configuración adicional (que es suficiente, en la mayoría de los casos). Si necesita hacer caso omiso de algunas propiedades, o definir la política de la serialización de objetos incrustados, lea este .
En su caso, se necesitaría algo así como
@BeanInfo
case class Example(id: String,
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef)
implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
val serializer = Serializer.ScalaJSON
}
- En general, no es necesario para serializar sus clases de casos explícitamente, cuando se está enviando mensajes a los agentes remotos en Akka - sí Akka serializa todos los datos con protobufs antes de enviarlos a través de TCP.
- ¿Por qué necesitaría serializar referencia al actor? Si es sólo necesaria para llamar al remitente por el actor que recibe el mensaje, puede simplemente usar
self.sender
, si el mensaje fue enviado con!
oself.senderFuture
, cuando los mensajes se envían con!!
o!!!
. ActorRef (o RemoteActorRef) en sí es simplemente una interfaz abstracta a un actor, que se utiliza para encapsular la aplicación y dejar que los aspectos externos de los actores internos se comunican con el actor sólo a través de los mensajes (en contraste con los actores stdlib / al igual que se hace en Erlang [procesos]) y ejerce en muy pequeña cantidad de datos que tenga sentido para serializar y enviar a través de cable.