簡體   English   中英

我可以將Java序列化對象反序列化為不同的類嗎?

[英]Can I DeSerialize a java serialized object to different classes?

不確定如何提出問題。 嘗試一下:

我有兩個氣霧緩存(集合),分別是X,Y。

一個罐子有兩個版本,每個版本都有一個com.xyz.MyClass類

jar1:

com.xyz.MyClass{
    com.abc.Request request;
    ...
}

jar2:

com.xyz.MyClass{
    com.pqr.Request request;
    ...
}

現在,jar1中的MyClass的某些對象存儲在緩存X中,而jar2中的MyClass的某些對象存儲在緩存Y中。

我想反序列化兩個緩存中的數據,執行一些計算並存儲在數據庫中。

我無法序列化,因為兩個罐子中MyClass的完全限定名稱是相同的。

我將刪除其中一個緩存(但這將需要一些時間)。 因此,希望暫時解決此問題。

我可以很好地處理嗎?

也許反序列化為某種中介(不關心包,而僅關心類結構),然后反序列化為MyClass。

注意:這兩個類具有相同的結構,只是成員變量的包名稱不同。

PS:不想使用多個類加載器。

要實現它,將需要大量的魔術,而禁止classloader魔術會刪除您一半的選擇。

我可以提出的解決方案是編輯序列化數據。 對象序列化的格式是已知的,並且是Java規范的一部分。 因此,您可以編輯此字節以將一個類名替換為另一個類名,但是我建議您在開始實現之前三思而后行。 這可能不是那么瑣碎的任務。

生成兩個不同的serialVersionUID ,並在每個類中使用它們。

private static final long serialVersionUID = -7000188057019447678L;// Add this in MyClass of jar1

private static final long serialVersionUID = -3944128180162145709L;// Add this in MyClass of jar2

您可以使用Eclipse IDEJDK的serialver工具生成自己的serialVersionUID。

注意 :如果未聲明serialVersionUID,則JVM將使用其自己的算法來生成默認的SerialVersionUID。 您可以在此處檢查算法

默認的serialVersionUID計算對類詳細信息高度敏感,並且可能因不同的JVM實現而異,並且在反序列化過程中會導致意外的InvalidClassExceptions。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM