Вопрос

Хорошо, поэтому я пишу неявные преобразования для классов корпуса в 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 / многое, как это сделано в эрланге [процессы]) и Держит очень небольшое количество данных, имеющих смысл сериализовать и отправлять через провод.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top