警告:[Kryo]无法使用Kryo的类加载器加载类x

问题描述:

警告:[kryo]无法使用kryo的ClassLoader加载类slade.core.Child。重试与目前...警告:[Kryo]无法使用Kryo的类加载器加载类x

无法找到类:slade.core.Child

序列化跟踪:

子(slade.core.Parent)

我有一个问题,即尝试反序列化根对象类型中包含的自定义对象类型时,Kryo抛出上述错误。这只发生在从OSGi包内运行并从另一个OSGi包内引用对象时。 (我使用Karaf作为我的OSGi实现)

我可以看到,这是类加载器,但我可以看到它使用它所需的类型加载器。我上传了一个tar,其中包含NetBeans内部创建的3个示例项目,以显示孤立的问题。没有使用自定义类加载器(如示例代码中所示)。

项目设置:

核心

  • OSGi包
  • 包含ParentChild
  • 出口一切

包子DLE

  • OSGi包
  • 对KRYO
  • 依赖性对芯的依赖
  • 创建的Parent含有Child一个实例的实例,再序列成使用KRYO一个字节数组并试图反序列化回目标(这是发生错误的地方)
  • 使用类加载器:BundleWiringImpl$BundleClassLoader

应用

  • Java应用程序
  • 上KRYO
  • 的依赖对
  • 依赖性创建的Parent含有Child一个实例的实例,再序列转换成使用Kryo的字节数组并成功反序列化为对象
  • 使用类加载器:Launcher$AppClassLoader

有关如何解决此问题的任何建议将不胜感激!

源代码可以从here下载。

我不是Kryo的专家,但听起来好像Kryo默认情况下不是OSGi兼容的,并且考虑到它的功能(serialise和deserialise对象)我会想象这是非常困难的。

在OSGi中,每个bundle都有自己的ClassLoader,只能看到bundle中的类以及从其他bundle(或它们的包)导入的类。如果,正如我上面所说的,Kryo不是OSGi兼容的,那么它将不导入任何软件包,如果您考虑它,它如何导入人们想要使用的所有可能软件包?我想Kryo需要你想要反序列化的类,因为它有一个'蓝图'来从字节流构造一个实例,但是如果它没有得到可见性它怎么能这样做呢?因此,班级没有发现异常(我相信)。

你如何解决这个问题?不容易,我想。我不得不做类似的事情,但幸运的是,我工作过的图书馆有一种方法允许我注册一个Class对象,以便它知道那个类。我不知道Kryo是否具有相同的功能。

+0

我的确看到了有关在kryo实例上设置类加载器的问题,但是我确信它在我尝试时没有用。我可能没有正确实施,所以我会再看看它。我想我可能已经看到了关于注册课程的一些内容,所以我会进一步深入研究 –