Отправка Akka Actorref к JSON
Вопрос
Хорошо, поэтому я пишу неявные преобразования для классов корпуса в SCALA, используя SJSON, чтобы отправить сообщения в удаленные актеры с помощью Akka Framework. Один из классов дела выглядит так
case class Example(id: String, actr: ActorRef)
Как бы я пошел в написание неявного класса этого дела.
Я видел, что Actorrefs имеют настольный метод, но мне нужно отправить его Тоджом
Решение
- http://doc.akkasource.org/serialization-scala. Отказ Явная [глубокая] сериализация может потребоваться только для государственных субъектов, когда основной экземпляр актера (в соответствии с Actorref / RemoteActorref) содержит некоторые важные данные выполнения. Для этого вам следует реализовать следующий типограф для вашего актера:
/** * 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, без дополнительной конфигурации (что достаточно, в большинстве случаев). Если вам нужно игнорировать некоторые свойства или определить политику сериализации встроенных объектов, чтение это.
В вашем случае вам понадобится что-то вроде
@BeanInfo
case class Example(id: String,
@(JSONTypeHint @field)(value = classOf[MyActor])
actr: ActorRef)
implicit object MyActorFormat extends SerializerBasedActorFormat[MyActor] {
val serializer = Serializer.ScalaJSON
}
- В общем, вам не нужно явно сериализовать ваши классы в случае, когда вы отправляете сообщения в удаленные актеры в Akka - сама Akka сериализуют все данные с Protobufs, прежде чем отправлять по TCP.
- Почему вам нужно сериализировать ссылку на актер? Если это просто нужно позвонить на отправителя актером, который получает сообщение, вы можете просто использовать
self.sender
, если сообщение было отправлено с!
, илиself.senderFuture
, когда сообщения отправляются с!!
или!!!
. Отказ ACCORREF (или REMOTACTORREF) само по себе является просто абстрактным интерфейсом для актера, используемого для инкапсуляции реализации внутреннего актера и отпустить внешние взаимодействия с актером только по сообщениям (в отличие от актеров STDLIB / многое, как это сделано в эрланге [процессы]) и Держит очень небольшое количество данных, имеющих смысл сериализовать и отправлять через провод.