如何使用Scala / Kryo采用泛型类型的方法读取序列化对象?

时间:2016-08-11 03:29:26

标签: scala kryo

当我知道特定的类类型时,使用Kryo读取序列化对象很容易,但是如果我想创建一个采用简单泛型类型的方法,该怎么做呢? 我有无法编译的代码:

def load[T](path: String): T = {
    val instantiator = new ScalaKryoInstantiator
    instantiator.setRegistrationRequired(false)
    val kryo = instantiator.newKryo()
    val input = new Input(FileUtils.readFileToByteArray(new File(path)))
    kryo.readObject[T](input, classOf[T])
}

我得到的错误是:

class type required but T found
    kryo.readObject[T](input, classOf[T])

我知道错误的含义,但不知道解决错误的正确方法。

代码由我原来的特定类型代码修改:

def load(path: String): SomeClassType = {
    val instantiator = new ScalaKryoInstantiator
    instantiator.setRegistrationRequired(false)
    val kryo = instantiator.newKryo()
    val input = new Input(FileUtils.readFileToByteArray(new File(path)))
    kryo.readObject(input, classOf[SomeClassType])
} 

1 个答案:

答案 0 :(得分:2)

我找到了答案,关键是ClassTag

def load[M: ClassTag](path: String)(implicit tag: ClassTag[M]): M = {
    val instantiator = new ScalaKryoInstantiator
    instantiator.setRegistrationRequired(false)
    val kryo = instantiator.newKryo()
    val input = new Input(FileUtils.readFileToByteArray(new File(path)))
    kryo.readObject(input, tag.runtimeClass.asInstanceOf[Class[M]])
}

在某些主题中,最后一行是:

kryo.readObject(input, tag.runtimeClass)

这在我的情况下不起作用,必须是:

tag.runtimeClass.asInstanceOf[Class[M]]