Avro에 직렬화하는 각 클래스 유형에 대해 내 프로젝트에 계속해서 나타나는이 코드가 있습니다.
class FooKryoRegistrator extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classOf[Foo], SpecificRecordBinarySerializer(classTag[Foo]))
kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]]))
}
}
이제 내 프로젝트의 모든 엔터티 (Foo, Bar, Baz .....)에 대해이 Registrator 클래스를 작성하는 대신이 일반을 만드는 것이 더 나을 것이라고 생각했습니다. 그래서 나는
class GenericKryoRegistrator[T] extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classOf[T], SpecificRecordBinarySerializer(classTag[T]))
kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]]))
}
}
하지만 컴파일 시간 오류가 발생합니다.
class type required but T found
이 오류를 검색 한 결과 클래스 대신 ClassTag를 사용해야한다는 권장 사항을 발견했습니다. 그래서 구현을 다음과 같이 변경했습니다.
class GenericKryoRegistrator[T] extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(classTag[T].runtimeClass, SpecificRecordBinarySerializer(classTag[T]))
kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]]))
}
}
그러나 지금 그것은 말한다
No ClassTag available for T
클래스 태그를 클래스에 대한 암시 적 인수로 사용하면 다음과 같이 사용할 수 있습니다.
class GenericKryoRegistrator[T] (implicit ct: ClassTag[T]) extends KryoRegistrator {
override def registerClasses(kryo: Kryo) {
kryo.register(ct.runtimeClass, SpecificRecordBinarySerializer(ct))
kryo.register(classOf[GenericData.Array[_]], new SpecificInstanceCollectionSerializer(classOf[java.util.ArrayList[_]]))
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다