WARN: [kryo] Unable to load class slade.core.Child with kryo's ClassLoader. Retrying with current...
Unable to find class: slade.core.Child
Serialization trace:
child (slade.core.Parent)
我有一个问题,当尝试反序列化包含在根对象类型中的自定义对象类型时,Kryo 会抛出上述错误。这仅在从 OSGi 包内运行并从另一个 OSGi 包内引用对象时发生。 (我使用 Karaf 作为我的 OSGi 实现)
我可以看出这与类加载器有关,尽管从我可以看出它正在使用它需要的类型加载器。我上传了一个 tar,其中包含在 NetBeans 中创建的示例 3 个项目,以显示孤立的问题。没有使用自定义类加载器(如示例代码中所示)。
项目设置:
核心
- OSGi 包
- 包含
Parent
和Child
类 - 导出所有内容
捆绑
- OSGi 包
- 依赖于 Kryo
- 依赖于核心
- 创建包含
Child
实例的Parent
实例,然后使用 Kryo 序列化为字节数组并尝试反序列化回对象(这是错误所在发生) - 使用类加载器:
BundleWiringImpl$BundleClassLoader
应用
- Java 应用程序
- 依赖于 Kryo
- 依赖于核心
- 创建包含
Child
实例的Parent
实例,然后使用Kryo序列化为字节数组并成功反序列化回对象 - 使用类加载器:
Launcher$AppClassLoader
如有任何关于如何解决此问题的建议,我们将不胜感激!
源代码可以从here下载.
最佳答案
我不是 Kryo 专家,但听起来好像 Kryo 默认不兼容 OSGi,考虑到它的功能(序列化和反序列化对象),我认为很难做到这一点。
在 OSGi 中,每个 bundle 都有自己的 ClassLoader,并且只能看到 bundle 中的类以及它从其他 bundle(或其包)导入的那些类。如果,正如我上面所说,Kryo 不兼容 OSGi,那么它将不会导入任何包,如果你考虑一下它如何导入人们想要使用的所有可能的包?我想 Kryo 需要你希望反序列化的类,它有一个“蓝图”来从字节流构造一个实例,但如果它没有可见性,它怎么能这样做呢?因此该类未发现异常(我相信)。
如何解决这个问题?我想这并不容易。我不得不做类似的事情,但幸运的是,我使用的库有一个方法允许我注册一个 Class 对象,这样它就可以识别该类。不知道Kryo有没有同样的功能。
关于java - 警告 : [Kryo] Unable to load class x with Kryo's ClassLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134108/