在Android应用程序中的readObject时的EOFException

时间:2011-05-28 04:04:01

标签: java android serializable objectinputstream eofexception


我使用序列化来保存我的Android应用程序中的数据。一切都运作良好,直到用户报告他无法打开他的文件 在检查了他发给我的文件后,发现问题是readObject()时出现EOFException。

我在vim中打开了.ser文件,它不是空的。它看起来像其他可以正常打开的文件一样正常 当用户保存.ser文件时,不会发生意外。

我的问题是:
1.首先使用序列化是错误的决定吗? 2.我的代码在大多数情况下都能正常工作,但我可能错过了最终导致这个问题的东西 3.用户说该文件对他来说非常重要,所以我真的想找到一个解决方法来打开这个文件。

以下是代码如何重命名的文件:

    FileInputStream f_in = null;
    ObjectInputStream obj_in = null;

    f_in = new FileInputStream(fileName);
    obj_in = new ObjectInputStream (f_in);
    mBlock = (Block)obj_in.readObject();

以下是我用于保存序列化的代码。

saveObjToFile(mBlock, mFileName);

static void saveObjToFile(Serializable object, String fileName)                     
throws IOException{
    FileOutputStream f_out = null;
    ObjectOutputStream obj_out  = null;
    try{
        File note_file = new File(fileName);
        f_out = new FileOutputStream(note_file);
        obj_out = new ObjectOutputStream (f_out);
        obj_out.writeObject(object);
        obj_out.flush();
        obj_out.close();
    }finally{
        if (obj_out != null)
            try{
                obj_out.close();
            }catch(IOException e){

            }
        if (f_out != null)
            try{
                f_out.close();
            }catch(IOException e){

            }
    }
}

以下是块定义的代码片段:

public class Block implements Serializable{
        private static final long serialVersionUID = -4369689728261781215L;
        private int mType;
        private byte[] mContent;
        private ArrayList<Block> mChildren = null;
        //... no more attributes.
}

2 个答案:

答案 0 :(得分:0)

在保存serializable的代码中,处理异常的位置在哪里?

我认为可以安全地假设,因为您无法读取文件,在写入文件时引发了异常。在我看来,如果您在遇到错误后关闭输出流,您将能够恢复该文件,这是值得怀疑的。

答案 1 :(得分:0)

EOFException是正常!它只是意味着你到了对象流的末尾。如果在读取第一个对象时得到它,则该流中没有对象。请注意,它确实有一个对象输出流标题,否则您将得到一个不同的异常,因此它不是空的。只是没有物体。