2016-10-31 57 views
0

* * .gz文件是在我使用的軟件包的先前版本(它具有類tratz.semantics.ClassificationBundle)下創建的。在當前版本中,該類名爲miacp.semantics.ClassificationBundle。兩人有相同的成員。有什麼方法可以讓更早的版本在更高版本中可讀?基本讀取功能是從GZipped文件中讀取對象的ClassNotFoundException

ClassificationBundle bundle = (ClassificationBundle) ois.readObject(); 

我有早期版本,所以我可以讀取該版本中的文件。但是,我將如何創建一個可以在新版本中讀取的新文件?

+3

你已經被咬過一次了:我會停止使用Java序列化進行長期存儲。例如,使用JSON或XML等更具可讀性,可自定義的可移植機制,任何使用任何語言的任何具有任何庫版本的程序都能夠讀取。而且任何文本編輯器都可以編輯。 –

+0

這些文件相當大(50MB到90MB);我正在加載其中五個。數據結構非常複雜。 – Ken

+0

如果'miacp'軟件包與'tratz'軟件包不衝突,你應該可以將兩個軟件包放在同一個類路徑中。編寫一個實用程序,將'tratz.semantics.ClassificationBundle'對象的內容複製到新的'miacp.semantics.ClassificationBundle'對象中。 – flakes

回答

0

Java二進制序列化非常懲罰任何重構。遺憾的是,tratz.semantics.ClassificationBundle永遠不能被反序列化爲miacp.semantics.ClassificationBundle

JSON或XML序列化是這類問題的常見解決方案。或者,您可以創建自定義的存儲格式。或者,您可以簡單地存儲基元/簡單數據值,然後加載這些值,而不是加載自定義對象(int/long/double/String/...等)。

0

tratz.semantics.ClassificationBundle類放回readResolve()方法將創建您的新對象。當所有序列化內容以新格式反序列化時(作爲新類),您將能夠刪除這個舊存根。

0

我跟着成功的建議,把這兩個包放在classpath中。描述細節有希望是有用的。使用Netbeans,我創建了另一個源路徑tratz並添加了一個子文件夾並將原始ClassificationBundle類複製到該文件夾​​中。 Netbeans告訴我需要導入的其他軟件包,所以我能夠將這些文件複製到相應的子文件夾。然後我回到上面引用的原始代碼來讀取對象。我繼續爲其他課程獲得ClassNotFoundException。這導致需要複製其他類。最終,我複製了57個類,並能夠成功讀取GZip文件。下一步是編寫實用程序來複制內容(簡單得多,但考慮到數據結構的複雜性,仍然有一定難度)。

謝謝