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

¿Fue útil?

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 ! o self.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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top