2016-08-11 6 views
0

Использование Kryo для чтения сериализованного объекта легко, когда я знаю конкретный тип класса, но если я хочу создать метод, который использует простой общий тип, как это сделать? У меня есть код, который не может быть скомпилирован:Как читать сериализованный объект методом, использующим общий тип Scala/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

Я нашел ответ, ключ 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]]