首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以为akka编写upickle序列化程序?

是否可以为akka编写upickle序列化程序?
EN

Stack Overflow用户
提问于 2020-09-05 15:13:47
回答 2查看 99关注 0票数 0

我想使用upickle实现一个akka序列化程序,但我不确定它是否可行。要做到这一点,我需要实现一个序列化程序,如下所示:

代码语言:javascript
复制
import akka.serialization.Serializer
import upickle.default._

class UpickleSerializer extends Serializer {

    def includeManifest: Boolean = true
    def identifier = 1234567

    def toBinary(obj: AnyRef): Array[Byte] = {
        writeBinary(obj) // ???
    }

    def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
        readBinary(bytes) // ???
    }
}

问题是,如果没有相关的Writer/Reader,我就无法调用Writer/readB进制。有什么方法可以根据object类来查找这些信息吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-05 18:35:26

我找到了一种用反射来做这件事的方法。我的解决方案基于这样一个假设:任何需要序列化的对象都应该在其配套对象中定义一个ReadWriter:

代码语言:javascript
复制
class UpickleSerializer extends Serializer {

private var map = Map[Class[_], ReadWriter[AnyRef]]()

def includeManifest: Boolean = true
def identifier = 1234567

def toBinary(obj: AnyRef): Array[Byte] = {
    implicit val rw = getReadWriter(obj.getClass)
    writeBinary(obj)
}

def fromBinary(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = {
    implicit val rw = lookup(clazz.get)
    readBinary[AnyRef](bytes)
}

private def getReadWriter(clazz: Class[_]) = map.get(clazz) match {
    case Some(rw) => rw
    case None =>
        val rw = lookup(clazz)
        map += clazz -> rw
        rw
}

private def lookup(clazz: Class[_]) = {
    import scala.reflect.runtime._
    val rootMirror = universe.runtimeMirror(clazz.getClassLoader)
    val classSymbol = rootMirror.classSymbol(clazz)
    val moduleSymbol = classSymbol.companion.asModule
    val moduleMirror = rootMirror.reflectModule(moduleSymbol)
    val instanceMirror = rootMirror.reflect(moduleMirror.instance)
    val members = instanceMirror.symbol.typeSignature.members
    members.find(_.typeSignature <:< typeOf[ReadWriter[_]]) match {
        case Some(rw) =>
            instanceMirror.reflectField(rw.asTerm).get.asInstanceOf[ReadWriter[AnyRef]]
        case None =>
            throw new RuntimeException("Not found")
    }
}

}

票数 0
EN

Stack Overflow用户

发布于 2020-09-05 16:15:44

看看下面的文件,你应该有一些想法!

CborAkkaSerializer.scala

LocationAkkaSerializer.scala

注意:这些序列化程序正在使用cbor

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63755427

复制
相关文章

相似问题

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