EOFException, когда readObject в приложении для Android - PullRequest
0 голосов
/ 28 мая 2011


Я использую сериализацию, чтобы сохранить данные в моем приложении для 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.
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2011

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

0 голосов
/ 28 мая 2011

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

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

...