0
我想將一個序列化的對象從一個進程傳遞給另一個進程,但它看起來好像類加載器已經從默認的Java實現中改變了,並且是衝突的。如何顯式調用標準java類加載器實現進行序列化?
如何使用某個標準Java類加載器從一個進程創建一個對象,以便保證一致性?
我從來沒有在Java中使用類加載器,所以我的理解非常有限。
我想將一個序列化的對象從一個進程傳遞給另一個進程,但它看起來好像類加載器已經從默認的Java實現中改變了,並且是衝突的。如何顯式調用標準java類加載器實現進行序列化?
如何使用某個標準Java類加載器從一個進程創建一個對象,以便保證一致性?
我從來沒有在Java中使用類加載器,所以我的理解非常有限。
序列化的工作不是由類加載器完成的。實際上,類加載器的唯一參與是它需要在反序列化該類的對象時加載類,如果該類尚未加載,則可能需要或。
很難看出如何更改類加載器可能會導致問題。但是,如果類加載器正在加載類的不兼容版本,則可能會出現問題。這可能會導致衝突。但根源是不同的類版本,而不是不同的類加載器。
如何避免衝突?簡單的答案是在序列化實例時不要更改類。有辦法處理班級變更(例如使用自定義readObject
/writeObject
方法),但最好避免此問題。
這是爲什麼Java對象序列化不是持久數據的很好機制的原因之一。
Serializables聲明一個串行版本uid。當試圖對一個對象進行反序列化時,會檢查此id以確保被反序列化的對象的類與反序列化發生的classloader可用的同名類匹配。在兩個進程之間使用的'''.class'''文件可能不同。 –
默認情況下,您始終使用默認的類加載器。你能向我們展示一個重現問題的例子嗎? –