Akka 有没有一种方法可以根据编解码器的类访问编解码器
我希望使用circe实现一个akka序列化程序。假设我已经定义了需要与其编解码器一起序列化的类,因此:Akka 有没有一种方法可以根据编解码器的类访问编解码器,akka,akka-cluster,circe,Akka,Akka Cluster,Circe,我希望使用circe实现一个akka序列化程序。假设我已经定义了需要与其编解码器一起序列化的类,因此: @JsonCodec sealed trait Command extends JsonSerializable case class Activate() extends Command case class DeActivate() extends Command object Command 以及要序列化的类: abstract class CirceSerializer(table:
@JsonCodec sealed trait Command extends JsonSerializable
case class Activate() extends Command
case class DeActivate() extends Command
object Command
以及要序列化的类:
abstract class CirceSerializer(table: Map[Class[_], Codec[_]]) extends Serializer {
def includeManifest: Boolean = true
def identifier = 3456789
def toBinary(obj: AnyRef): Array[Byte] = {
table.get(obj.getClass) match {
case Some(codec) =>
codec.asInstanceOf[Codec[AnyRef]](obj).asString.get.getBytes(StandardCharsets.UTF_8)
case None =>
throw new RuntimeException("No codec defined for object: " + obj)
}
}
def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = clazz match {
case Some(cls) =>
fullTable.get(cls) match {
case Some(codec) =>
val str = new String(bytes, StandardCharsets.UTF_8)
codec.decodeJson(Json.fromString(str))
case None =>
throw new RuntimeException("No codec defined for class: " + cls)
}
case None =>
throw new RuntimeException("Specified includeManifest but it was never passed")
}
}
但是我必须为每个需要序列化的类显式地传递一个编解码器:
class MyCirceSerilaizer extends CirceSerializer(Map(
classOf[Activate] -> deriveCodec[Activate],
classOf[DeActivate] deriveCodec[DeActivate])) {
}
是否有一种更通用的方法可以避免显式映射每个类