自定义 akka 持久化(Play!)JSON(反)序列化程序

4
我可以将相关演员的信息序列化/反序列化为Play! JSON格式。我希望能够使用JSON(反)序列化器来处理akka持久性系统中的数据(如果可能的话)。
akka持久性文档中,有使用自定义序列化器的选项。此外,这里是编写自定义序列化器的说明。由于akka.serialization.Serializer需要使用toBinaryfromBinary方法,是否有办法将Play JSON序列化器与akka持久性一起使用呢?
谢谢!
祝好!

JSON到底是什么?你能将它序列化为String吗?你能将String序列化为Array[Byte]吗? - Cem Catikkas
你有没有碰巧找到一个简单的方法来做它? - CanardMoussant
2个回答

0

0

将play json集成到akka-persistence中是比较复杂的,因为play json使用通过隐式参数收集的Format实例。Akka仅提供java.lang.Object用于序列化和java.lang.Class [_] 用于反序列化,这使得解析正确的隐式Format变得不可能。

您可以编写自定义的akka.serialization.Serializer,其中包含从Class[A]Format[A]Map。该映射可用于查找java.lang.Object/java.lang.Class[_]的正确格式:

class JsonSerializer(serializers: Map[Class[_], Format[_]]) extends Serializer {
  val charset: Charset = StandardCharsets.UTF_8
  val identifier: Int = "play-json-serializer".##
  val includeManifest: Boolean = true

  def serializer[A](c: Class[_]): GenericFormat[A] = serializers.get(c) match {
    case Some(format) => format.asInstanceOf[GenericFormat[A]]
    case None => throw new RuntimeException("No Format available for " + c.getName)
  }

  def toBinary(o: AnyRef): Array[Byte] = jsonSerialize(o).getBytes(charset)
  def fromBinary(bytes: Array[Byte], manifest: Option[Class[_]]): AnyRef = jsonDeserialize(bytes, manifest.get)

  def jsonSerialize[A](a: A): String = {
    implicit val format: GenericFormat[A] = serializer[A](a.getClass)
    Json.stringify(Json.toJson(a))
  }

  def jsonDeserialize[A](bytes: Array[Byte], manifest: Class[_]): A = {
    implicit val format: GenericFormat[A] = serializer[A](manifest)
    Json.fromJson[A](Json.parse(new String(bytes, charset))).get
  }
}

现在您可以继承此类并将所有类型的播放格式传递到构造函数中,以便您的 akka-serializer 可以进行序列化和反序列化。必须在 akka 配置中配置此序列化器 如文档所述

class MyJsonSerializer extends JsonSerializer(Map(
  Serializer[Foo], Serializer[...], ...
))

// Just a utility class for the pretty syntax above
object Serializer {
  def apply[A](implicit format: Format[A], ctag: ClassTag[A]): (Class[A], Format[A]) =
    (ctag.runtimeClass.asInstanceOf[Class[A]], format)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接