[英]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 IDE或JDK的serialver工具生成自己的serialVersionUID。
注意 :如果未聲明serialVersionUID,則JVM將使用其自己的算法來生成默認的SerialVersionUID。 您可以在此處檢查算法。
默認的serialVersionUID計算對類詳細信息高度敏感,並且可能因不同的JVM實現而異,並且在反序列化過程中會導致意外的InvalidClassExceptions。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.