警告:[Kryo]无法使用Kryo的ClassLoader

时间:2017-09-09 18:57:00

标签: java serialization osgi kryo

  

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

     

找不到类:slade.core.Child

     

序列化跟踪:

     

child(slade.core.Parent)

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

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

项目设置:

  • OSGi包
  • 包含ParentChild
  • 导出所有内容

  • OSGi包
  • 依赖Kryo
  • 依赖核心
  • 创建包含Parent实例的Child实例,然后使用Kryo序列化为字节数组,并尝试反序列化回到对象(这是错误发生的地方)
  • 使用类加载器:BundleWiringImpl$BundleClassLoader

应用

  • Java应用程序
  • 依赖Kryo
  • 依赖核心
  • 创建包含Parent实例的Child实例,然后使用Kryo序列化为字节数组并成功反序列化回对象
  • 使用类加载器:Launcher$AppClassLoader

非常感谢任何有关如何解决此问题的建议!

可以从here下载源代码。

1 个答案:

答案 0 :(得分:1)

我不是Kryo的专家,但听起来好像Kryo默认情况下不兼容OSGi并且考虑到它的功能(序列化和反序列化对象)我会想象很难做到这一点。

在OSGi中,每个bundle都有自己的ClassLoader,并且只能看到bundle中的类以及从其他bundle(或它们的包)导入的那些类。如上所述,如果Kryo不兼容OSGi,那么它将不会导入任何软件包,如果您考虑它,它如何导入人们想要使用的所有可能的软件包?我想Kryo要求你想要反序的课程,因为它有一个'蓝图'从字节流构造一个实例,但如果它没有可见性,它怎么能这样做呢?因此,没有找到类别(我相信)。

你怎么解决这个问题?我觉得不容易。我必须做类似的事情,但幸运的是我工作的库有一个方法允许我注册一个Class对象,所以它就知道那个类。我不知道Kryo是否具有相同的功能。