2013-05-13 97 views
1

我在新會話中對Java中的文件進行反序列化時遇到問題。反序列化ArrayList

我可以序列化ArrayList到文件,然後在同一個會話中反序列化它,但是,如果我創建一個新的Main對象並嘗試反序列化在前一個會話中工作的同一個文件,則代碼不起作用。

這是爲什麼?

這裏是我的代碼:

public void LoadPersonListFromFile(String Filename) 
{ 
    try 
    { 
    PersonList = new ArrayList<Person>();   
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(Filename)); 
    ArrayList<Person> PersonList = (ArrayList<Person>) in.readObject(); 
    in.close(); 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 

public void SavePersonFileToFile(String Filename) 
{ 
    try 
    { 
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(Filename)); 
    out.writeObject(PersonList); 
    out.close(); 
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 

編輯

反序列化似乎是工作,因爲如果我做了.size()的列表中LoadPersonListFromFile方法調用,我得到值爲2.但是,如果我在LoadPersonListFromFile方法外調用List上的.size()方法,那麼.size()顯示爲0.爲什麼這會是?我是否需要將反序列化的ArrayList複製到專用字段中?

我有以下私有字段存儲的ArrayList在類的頂部:

private ArrayList<Person> PersonList; 

EDIT2

得到它的工作。下面是代碼:

public void LoadPersonListFromFile(String Filename) 
{ 
    try 
    { 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(Filename)); 
    ArrayList<Person> PersonListFromFile = (ArrayList<Person>) in.readObject(); 
    in.close(); 
    PersonList = PersonListFromFile;  
    } 
    catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 
} 
+1

你能分享如有異常? – sanbhat 2013-05-13 07:39:57

+0

上述代碼有什麼問題?看起來很好。 – 2013-05-13 07:40:46

+0

你'人'類實現'Serializable'嗎? – 2013-05-13 07:41:50

回答

1

看來你沒有定義靜態最後長serialVersionUIDPerson類。基本上,當你編譯一個Serializable類,它沒有在源代碼中定義的serialVersionUID時,Java編譯器會用隨機值爲你定義它。

要解決此問題,定義Person類以下內容:

private static final long serialVersionUID = 1L;