Domanda

Ok, quindi sto scrivendo conversioni implicite per le classi di casi in scala, utilizzando SJSON, per inviare messaggi ad attori remoti utilizzando il framework Akka. Uno dei look classi caso come questo

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

Come potrei fare per scrivere il implicita per questa classe caso.

Ho visto che ActorRefs hanno un metodo toBinary ma ho bisogno di inviare toJSON

È stato utile?

Soluzione

  • http://doc.akkasource.org/serialization-scala . Esplicito [profondità] serializzazione può essere richiesto solo per i soggetti con stato, quando sottostante esempio attore (sotto ActorRef / RemoteActorRef) detiene alcuni dati runtime importanti. Per questo caso, è necessario implementare il seguente typeclass per il vostro attore:
/**
 * 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]

Se si desidera ScalaJSON serializzazione, al posto di quello di default, è necessario utilizzare SerializerBasedActorFormat tratto

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 supporti biblioteca serializzazione di pianura Scala oggetti out-of-box, senza una configurazione aggiuntiva (che è sufficiente, nella maggior parte dei casi). Se avete bisogno di ignorare alcune proprietà, o definire la politica la serializzazione di oggetti incorporati, lettura questo .

Nel tuo caso, si avrebbe bisogno di qualcosa come

@BeanInfo
case class Example(id: String, 
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef) 

implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
    val serializer = Serializer.ScalaJSON
}
  • In generale, non è necessario per serializzare i tuoi classi case in modo esplicito, quando si sta inviando messaggi agli attori remoti in Akka - Akka si serializza tutti i dati con protobufs prima di inviare su TCP.
  • Perché si deve serializzare riferimento l'attore? Se è solo bisogno di chiamare il mittente dall'attore che riceve il messaggio, si può semplicemente utilizzare self.sender, se il messaggio è stato inviato con ! o self.senderFuture, quando i messaggi vengono inviati con !! o !!!. ActorRef (o RemoteActorRef) su se stesso è solo un'interfaccia astratta ad un attore, utilizzato per incapsulare implementazione e lasciando esterni dell'attore interno comunicano con l'attore solo tramite messaggi (in contrasto con attori stdlib / proprio come si fa in Erlang [processi]) e tiene molto piccola quantità di dati che ha senso per serializzare e inviare sul filo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top