2017-09-09 22 views
1

경고 : [kryo] 클래스 slade.core.Child를 kryo의 ClassLoader로로드 할 수 없습니다. 현재와 ​​다시 시도 ... 경고 : [Kryo] 클래스 x를 Kryo 's ClassLoader로로드 할 수 없습니다.

클래스를 찾을 수 없습니다

:

직렬화 추적

slade.core.Child :

아이 (slade.core.Parent)

를 내가 문제 곳이 Kryo는 루트 객체 유형 내에 포함 된 사용자 정의 객체 유형을 비 직렬화하려는 경우 위의 오류를 발생시킵니다. 이는 OSGi 번들 내에서 실행하고 다른 OSGi 번들 내에서 오브젝트를 참조 할 때만 발생합니다. (필자는 OSGi 구현으로 Karaf를 사용하고 있습니다.)

이것이 클래스 로더와 관련이있는 것을 볼 수 있습니다 만, 필요한 로더를 사용하고있는 것으로 볼 수 있습니다. NetBeans 내부에서 작성된 샘플 3 프로젝트가 들어있는 타르 파일을 업로드하여 격리 된 문제를 보여줍니다. 사용자 정의 클래스 로더는 사용되지 않습니다 (샘플 코드에서 볼 수있는 것처럼).

프로젝트 설정 : OSGi 번들이

  • ParentChild 클래스가 포함되어

    • 코어는

    • 은 모두에게

    롤빵 수출 OSGi 번들

  • Kryo
  • 에 종속

    • 후,
    • Child의 인스턴스를 포함 Parent의 인스턴스를 생성 코어에 종속 DLE은 Kryo을 이용하여 바이트 배열로 직렬화 객체에 역 직렬화를 시도합니다 (오류가 발생한 곳입니다)
    • 클래스 로더 사용 : BundleWiringImpl$BundleClassLoader

    응용 프로그램

    • 자바 응용 프로그램
    • 는 Kryo
    • 에 대한 종속성
    • 을 가지고 핵심
    • 에 종속 후 직렬화, Child의 인스턴스를 포함 Parent의 인스턴스를 작성 있음 Kryo를 사용하여 바이트 배열로 변환하고 객체에 성공적으로 다시 직렬화합니다.
    • 클래스 로더 사용 : Launcher$AppClassLoader

    이 문제를 해결하는 방법에 대한 제안은 크게 감사하겠습니다.

    소스 코드는 here에서 다운로드 할 수 있습니다.

    답변

    1

    저는 Kryo의 전문가는 아니지만 Kryo가 기본적으로 OSGi와 호환되지 않으며 그 기능 (직렬 및 병렬 객체)을 고려한 것처럼 들리지만 매우 어렵습니다.

    OSGi에서 각 번들에는 고유 한 ClassLoader가 주어지며 번들 내의 클래스와 다른 번들 (또는 패키지)에서 가져온 클래스 만 볼 수 있습니다. 위에서 말했듯이, Kryo가 OSGi와 호환되지 않는다면 아무 패키지도 가져 오지 않을 것입니다. 만약 당신이 그것에 대해 생각한다면, 사람들이 사용하기를 원하는 모든 패키지를 어떻게 가져올 수 있습니까? Kryo가 바이트 스트림에서 인스턴스를 생성하는 '청사진'을 갖기 위해 당신이 deserialise하고자하는 클래스가 필요하다고 상상해보십시오. 그러나 그것이 가시성을 갖지 못하면 어떻게 그렇게 할 수 있습니까? 그러므로 클래스가 예외를 발견하지 못했습니다 (저는 믿습니다).

    어떻게 해결할 수 있습니까? 쉽사리 생각하지 않습니다. 비슷한 일을해야했지만 다행스럽게도 내가 작업 한 라이브러리에는 Class 객체를 등록 할 수있는 메소드가있어서 클래스를 인식 할 수있었습니다. Kryo가 같은 기능을 가지고 있는지 나는 모른다.

    +0

    kryo 인스턴스에 클래스 로더를 설정하는 방법을 보았습니다. 그러나 시도했을 때 작동하지 않았을 것입니다. 나는 그것을 올바르게 구현하지는 않았을 지 모르지만, 나는 그것에 대해 다시 한번 살펴 보겠다. 나는 클래스 등록에 관해서 뭔가를 보았을지도 모른다라고 생각한다. 그래서 나는 더 깊이 파헤 칠 것이다. –