2013-05-13 98 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;