【问题标题】:WARN: [Kryo] Unable to load class x with Kryo's ClassLoader警告:[Kryo] 无法使用 Kryo 的 ClassLoader 加载类 x
【发布时间】:2017-09-09 18:57:00
【问题描述】:

警告:[kryo] 无法使用 kryo 的 ClassLoader 加载类 slade.core.Child。正在重试当前...

找不到类:slade.core.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下载。

【问题讨论】:

    标签: java serialization osgi kryo


    【解决方案1】:

    我不是 Kryo 方面的专家,但听起来 Kryo 在默认情况下与 OSGi 不兼容,考虑到它的功能(序列化和反序列化对象),我想做到这一点非常困难。

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

    你怎么能解决这个问题?我认为不容易。我不得不做一些类似的事情,但幸运的是,我使用的库有一个方法可以让我注册一个 Class 对象,这样它就知道那个类了。不知道Kryo有没有同样的功能。

    【讨论】:

    • 我确实看到了一些关于在 kryo 实例上设置类加载器的内容,但我确信当我尝试它时它不起作用。不过,我可能没有正确地实现它,所以我会再看看它。我想我可能也看到了一些关于注册课程的内容,所以我将进一步深入研究
    • 我在类似的场景中也失败了(试图在两个进程之间传递 Kryo 序列化的 EclipseLink 实体)。几个小时后放弃。
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 2023-03-06
    • 2021-06-21
    • 2015-11-26
    相关资源
    最近更新 更多