0

我希望我的应用程序在会话之间将来自 ArrayList 的数据保存在文件中。我使用的类实现了可序列化。当我调试时,保存似乎没问题,没有抛出异常,并且通过循环正确的次数。加载只加载一些条目,然后抛出 EOF 异常。代码在这里:

public int saveChildren(Context context){
    FileOutputStream fos;
    ObjectOutputStream os;
    try {
        fos = context.openFileOutput(filename, Context.MODE_PRIVATE);
        os = new ObjectOutputStream(fos);
        for(Child c : children){
            os.writeObject(c);
        }
        os.close();
    }
    catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return 1;
    }
    catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return 2;
    }
    return 0;
}

public void loadChildren(Context context){

    FileInputStream fis;
    try {
        fis = context.openFileInput(filename);
        ObjectInputStream is;
        is = new ObjectInputStream(fis);
        while(is.readObject() != null){
            Child c = (Child) is.readObject();
            boolean skip = false;
            for(Child ch: children){
                if(ch.getName().equals(c.getName())){ 
                    skip = true;
                }
                if(ch.getNr().equals(c.getNr())){ 
                    skip = true;
                }
                if(ch.getImei() != null){
                    if(ch.getImei().equals(c.getImei())){
                        skip = true;
                    }
                }
            }
            if(!skip){
                children.add(c);
            }
        }
        is.close();
    }catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (StreamCorruptedException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }catch (OptionalDataException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

是什么导致错误?

4

2 回答 2

1

您可以直接将子对象写入 ObjectOutputStream。ArrayList 实现可序列化。您可能想要做的第二件事是在使用 os.flush() 关闭流之前刷新流。你将会有:

os = new ObjectOutputStream(fos);    
os.writeObject(children);    
os.flush();
os.close();

和阅读:

is = new ObjectInputStream(fis);
ArrayList<Child> children = (ArrayList<Child>)is.readObject();
is.close();
于 2012-04-19T21:27:55.090 回答
0

您正在使用ObjectInputStream#readObject()返回null作为循环的退出条件。#readObject()可以返回null- 如果您已序列化 a null- 但是如果由于您已到达流的末尾而无法读取对象,它将引发异常。

为了快速简便的解决方法:考虑在序列化子元素之前将数组的长度序列化为整数并使用 for 循环或类似结构来读取值 - 或序列化ArrayList自身。它也是Serializable

于 2012-04-19T21:29:02.477 回答