2011-04-29 95 views
0

我保存對象序列化時,然後再加載它有一個問題..問題與對象序列化

首先我必須與原來以下字符串「A」級,「B」,「C」 我救它與一些數據文件...

後來我修改了類,所以它有一個字符串「D」。 加載之前我保存的文件,我修改應用程序不知道新的字符串「D」...

什麼是最好的機制來處理這樣的問題......它將是非常漫長從舊對象中的數據複製到新的一個......我想使保存的對象知道,有一些結構的變化...

任何幫助,請...

回答

3

使用不同的serialVersionUID到告訴系統有一個不同的版本。

JavaDoc on Serializable:與每個序列化類

序列化運行時相關聯的一個版本號,稱爲的serialVersionUID,其被反序列化過程用於驗證序列化對象的發送者和接收者都加載的類爲對於序列化兼容的對象。 如果接收者已經爲與對應的發送者類具有不同serialVersionUID的對象加載了類,那麼反序列化將導致InvalidClassException。可序列化類可以通過聲明一個名爲「serialVersionUID」的字段來聲明自己的serialVersionUID,該字段必須是static,final和long類型的:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

(標記由我)

編輯:

正如你可以只使用另一字段來存儲版本和反序列化,儘管課改的替代品。在這種情況下,新字符串應該初始化爲空。然後,您可以檢查版本以查看該字符串是否存在於先前的版本中,並且在保存時僅爲空或者是否存在結構更改。

例子:

class MyObject { 
    private static final versionUid = 1; 
    private final int version; 

    private String a, b, c, d; //plus getters/setters; 

    public MyObject() { 
    version = versionUid ; //needed if you want to load objects of different backward compatible versions and still know the version after deserialization 
    } 

    public int getVersion() { 
    return version; 
    } 
} 


MyObject readObjectOfVersion2 = ... ;//deserialize an object of version 1 
if(readObjectOfVersion2.getVersion() > 1) {//assuming version 1 only has a,b,c and version 2+ has d as well  
    String d = readObjectOfVersion2.getD(); 
} 
+0

我很抱歉,我只是瞭解系列化..你能更具體?你能給我一些示例代碼嗎?所以我仍然可以加載我的舊文件.. 因爲我得到這個錯誤,當我嘗試加載我的舊文件使用新的結構 - > java.io.InvalidClassException:com.joymaster.hypereditor.data.TreeScriptContent;本地類不兼容:流classdesc serialVersionUID = -3425667071755815337,本地類serialVersionUID = -916187445672973996 – user430926 2011-04-29 08:02:56

+0

我會更新我的答案。 – Thomas 2011-04-29 08:06:11