警告:[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包
- 包含
Parent
和Child
类 - 出口一切
包子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是否具有相同的功能。
我的确看到了有关在kryo实例上设置类加载器的问题,但是我确信它在我尝试时没有用。我可能没有正确实施,所以我会再看看它。我想我可能已经看到了关于注册课程的一些内容,所以我会进一步深入研究 –