java - 警告 : [Kryo] Unable to load class x with Kryo's ClassLoader

标签 java serialization osgi kryo

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 包
  • 包含ParentChild
  • 导出所有内容

捆绑

  • 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/

相关文章:

c# - 将 List<String> 编码为普通 String 并将其解码回来的最简单方法是什么?

java - 有什么方法可以绕过未实现 Serialized 的类吗?

java - OSGi 中的 AWS SDK 导致 "Unable to resolve/Missing requirement"错误

java - 无法获取状态更改锁

java - 处理 XMLfile XStream API 时出现 ConversionException

java - Hibernate 4 忽略 MySQL 方言

java - Android Parcelable final

java - Felix 如何查看 bundle ?

java - 数据库到 GUI 或数据库到对象到 GUI

java - 我的方法不会接受对象