关于scala:将Akka actorRef发送给json

Sending an Akka actorRef to json

好的,我正在编写scala中case类的隐式转换,使用sjson,使用akka框架向远程参与者发送消息。其中一个case类看起来像这样

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

我该如何编写这个案例类的隐式代码呢?

我已经看到actorrefs确实有tobinary方法,但我需要把它发送给json


  • doc.akkasource.org http:/ / / serialization -斯卡拉。[深],可以显serialization只读状态所需的基本演员,当演员的实例(在actorref / remoteactorref)持有一些重要的运行时数据。这个案例,你应该为你的typeclass实现下面的演员:
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 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 serialization,而不是默认的一个,你应该使用SerializerBasedActorFormat性状

1
2
3
4
5
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平原serialization Scala对象的乱盒,没有额外的配置(这是足够的,在大多数情况下)。如果你需要定义一些属性或忽略,serialization政策学院嵌入式对象,读这个。

在你的案例,你会需要什么样

1
2
3
4
5
6
7
8
@BeanInfo
case class Example(id: String,
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef)

implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
    val serializer = Serializer.ScalaJSON
}
  • 总的来说,你不需要序列化的类的明确的案例,当你发送消息到远程演员本身在阿卡阿卡serializes -所有与在发送TCP数据protobufs过。
  • 为什么你需要参考到演员的序列化?它只是需要一个由演员呼叫发射机接收消息,你可以简单的使用self.sender,如果消息发送一个self.senderFuture!,或发送消息,当一个或!!!!!。在actorref(或remoteactorref)本身只是一个抽象的接口,在演员,演员的encapsulate用于内部和外部的沟通与执行让演员只通过消息(在对比到演员/多样的程序做的[它]在Erlang过程)和持有的非常小的量的数据让镰刀。序列化和森D过线。