首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义akka持久性(Play!)JSON (反)序列化程序

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

Stack Overflow用户
提问于 2015-01-27 22:41:44
回答 2查看 832关注 0票数 4

我将相关角色的消息(反)序列化到Play /从Play序列化!杰森。我想使用JSON (反)序列化的akka持久化系统(如果可能)。

akka persistance文档中,可以使用我们自己的序列化程序。此外,here还提供了如何编写自定义序列化程序的说明。既然akka.serialization.Serializer期望使用toBinaryfromBinary,有没有办法将Play JSON序列化程序与akka持久化一起使用?

谢谢!

最好的!

EN

回答 2

Stack Overflow用户

发布于 2015-03-11 14:56:21

您喜欢将数据序列化到哪里?我正在寻找一个基于mongodb的akka持久化存储,其中包含使用json格式的序列化对象。也许您也会对下面的驱动程序感兴趣:https://github.com/scullxbones/akka-persistence-mongo/issues/16

票数 0
EN

Stack Overflow用户

发布于 2019-01-06 07:30:34

将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[_]的正确格式

代码语言:javascript
复制
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序列化器应该能够(反)序列化的所有类型的播放格式传递给构造函数。必须在akka配置as described in the documentation中配置此序列化程序

代码语言:javascript
复制
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)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28173106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档