警告:[Kryo]无法使用Kryo的ClassLoader加载类x

问题描述 投票:1回答:1

警告:[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下载。

java serialization osgi kryo
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.