Исключение EOFException при readObject в приложении для Android

#java #android #serializable #objectinputstream #eofexception

#java #Android #сериализуемый #objectinputstream #исключение eofexception

Вопрос:

Я использую сериализацию для сохранения данных в моем приложении для Android. Все работает прекрасно, пока пользователь не сообщит, что он не может открыть свой файл.
После проверки файла, который он мне отправил, оказалось, что проблема заключается в исключении EOFException при readObject().

Я открыл файл .ser в vim, он не пустой. Это выглядит так же нормально, как и другие файлы, которые можно открыть обычным способом.
Ничего удивительного не произошло, когда пользователь сохранил файл .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.
}
  

Ответ №1:

Где в коде для сохранения сериализуемого обрабатывается исключение?

Я думаю, что можно с уверенностью предположить, поскольку вы не можете прочитать файл, что исключение было вызвано во время записи файла. На мой взгляд, сомнительно, что вы сможете восстановить файл, если вы просто закрыли outputstream после обнаружения ошибки.

Комментарии:

1. Я проверил код, обрабатывающий исключение, он перехватил и проигнорировал исключение IOException. Вы правы, возможно, было вызвано исключение. Но я не могу представить, что за исключение произошло? В следующий раз, когда во время записи произойдет исключение IOException, будет ли полезно попросить пользователя «повторить попытку» или «отменить»?

Ответ №2:

Исключение EOFException — это нормально!это просто означает, что вы добрались до конца потока объектов. Если вы получаете это при чтении первого объекта, в потоке нет объектов. Обратите внимание, что у него есть заголовок потока вывода объекта, иначе вы получили бы другое исключение, поэтому оно не пустое. Просто пусто от объектов.

Комментарии:

1. Спасибо за ваше объяснение! Как указывает Ник, я предполагаю, что проблема возникла при записи объекта.