2017-09-09 84 views
1

警告:[kryo]無法使用kryo的ClassLoader加載類slade.core.Child。重試與目前...警告:[Kryo]無法使用Kryo的類加載器加載類x

無法找到類:slade.core.Child

序列化跟蹤:

子(slade.core.Parent)

我有一個問題,即嘗試反序列化根對象類型中包含的自定義對象類型時,Kryo拋出上述錯誤。這隻發生在從OSGi包內運行並從另一個OSGi包內引用對象時。 (我使用Karaf作爲我的OSGi實現)

我可以看到,這是類加載器,但我可以看到它使用它所需的類型加載器。我上傳了一個tar,其中包含NetBeans內部創建的3個示例項目,以顯示孤立的問題。沒有使用自定義類加載器(如示例代碼中所示)。

項目設置:

核心

  • OSGi包
  • 包含ParentChild
  • 出口一切

包子DLE

  • OSGi包
  • 對KRYO
  • 依賴性對芯的依賴
  • 創建的Parent含有Child一個實例的實例,再序列成使用KRYO一個字節數組並試圖反序列化回目標(這是發生錯誤的地方)
  • 使用類加載器:BundleWiringImpl$BundleClassLoader

應用

  • Java應用程序
  • 上KRYO
  • 的依賴對
  • 依賴性創建的Parent含有Child一個實例的實例,再序列轉換成使用Kryo的字節數組併成功反序列化爲對象
  • 使用類加載器:Launcher$AppClassLoader

有關如何解決此問題的任何建議將不勝感激!

源代碼可以從here下載。

回答

1

我不是Kryo的專家,但聽起來好像Kryo默認情況下不是OSGi兼容的,並且考慮到它的功能(serialise和deserialise對象)我會想象這是非常困難的。

在OSGi中,每個bundle都有自己的ClassLoader,只能看到bundle中的類以及從其他bundle(或它們的包)導入的類。如果,正如我上面所說的,Kryo不是OSGi兼容的,那麼它將不導入任何軟件包,如果您考慮它,它如何導入人們想要使用的所有可能軟件包?我想Kryo需要你想要反序列化的類,因爲它有一個'藍圖'來從字節流構造一個實例,但是如果它沒有得到可見性它怎麼能這樣做呢?因此,班級沒有發現異常(我相信)。

你如何解決這個問題?不容易,我想。我不得不做類似的事情,但幸運的是,我工作過的圖書館有一種方法允許我註冊一個Class對象,以便它知道那個類。我不知道Kryo是否具有相同的功能。

+0

我的確看到了有關在kryo實例上設置類加載器的問題,但是我確信它在我嘗試時沒有用。我可能沒有正確實施,所以我會再看看它。我想我可能已經看到了關於註冊課程的一些內容,所以我會進一步深入研究 –

相關問題