警告: kryo无法用kryo的slade.core.Child加载类ClassLoader。用电流重试..。 找不到类: slade.core.Child 序列化跟踪: 儿童(slade.core.Parent)
在尝试反序列化根对象类型中包含的自定义对象类型时,Kryo抛出了上述错误。只有在从OSGi包中运行并在另一个OSGi包中引用对象时才会发生这种情况。(我使用Karaf作为我的OSGi实现)
我可以看到,这与类加载程序有关,不过从我所看到的情况来看,它使用的是它所需要的类型加载器。我已经上传了一个tar,其中包含在NetBeans中创建的示例3项目,以显示孤立的问题。不使用自定义类加载器(如示例代码中所示)。
项目设置:
核
Parent和Child类。丛
Parent实例的Child实例,然后使用Kryo序列化为字节数组,并尝试反序列化回对象(这是发生错误的地方)BundleWiringImpl$BundleClassLoader应用程序
Parent实例的Child实例,然后使用Kryo序列化为字节数组,并成功地反序列化回对象。Launcher$AppClassLoader任何关于如何解决这一问题的建议都将不胜感激!
源代码可以从这里下载。
发布于 2017-09-12 12:33:52
我不是Kryo方面的专家,但是听起来Kryo在默认情况下并不兼容OSGi,考虑到它的功能(序列化和反序列化对象),我可以想象很难做到这一点。
在OSGi中,每个包都有自己的ClassLoader,并且只对包中的类和从其他包(或它们的包)导入的类具有可见性。如果,正如我前面所说的,Kryo与OSGi不兼容,那么它将不导入任何包,如果您仔细考虑,它如何导入人们想要使用的所有可能的包?我设想Kryo需要您希望反序列化的类,以便它有一个从字节流构造实例的“蓝图”,但是如果它没有可见性,它怎么能这样做呢?因此,这个类没有发现异常(我相信)。
你怎么能解决这个问题?我觉得不容易。我不得不做一些类似的事情,但幸运的是,与我一起工作的库有一个方法,允许我注册一个class对象,这样它就知道了这个类。我不知道Kryo是否有同样的功能。
https://stackoverflow.com/questions/46134108
复制相似问题