我将相关角色的消息(反)序列化到Play /从Play序列化!杰森。我想使用JSON (反)序列化的akka持久化系统(如果可能)。
在akka persistance文档中,可以使用我们自己的序列化程序。此外,here还提供了如何编写自定义序列化程序的说明。既然akka.serialization.Serializer期望使用toBinary和fromBinary,有没有办法将Play JSON序列化程序与akka持久化一起使用?
谢谢!
最好的!
发布于 2015-03-11 14:56:21
您喜欢将数据序列化到哪里?我正在寻找一个基于mongodb的akka持久化存储,其中包含使用json格式的序列化对象。也许您也会对下面的驱动程序感兴趣:https://github.com/scullxbones/akka-persistence-mongo/issues/16
发布于 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[_]的正确格式
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中配置此序列化程序
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)
}https://stackoverflow.com/questions/28173106
复制相似问题