2016-08-11 3 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]]) 
} 

이, 마지막 줄은 예 :

tag.runtimeClass.asInstanceOf[Class[M]] 
관련 문제