EOFException с использованием readObject () десериализации ArrayList - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь сериализовать экземпляр из класса, используя наследование.

И это класс, в котором я пытаюсь сериализовать данные

public class Serializacion {

    static int agregarProfeTitular(ProfesorTitular p){
        int status = 0;

        try {
            FileOutputStream fos = new FileOutputStream("profestitulares.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            ArrayList pi = conseguirTodosProfesTitulares();

            pi.add(p);
            oos.writeObject(pi);
            oos.close();
            fos.close();

            status = 1;

        } catch (IOException e) {
            System.out.println("Error al agregar el prof titular..."+Arrays.toString(e.getStackTrace()));
        }

        return status;
    }

    static ArrayList<ProfesorTitular> conseguirTodosProfesTitulares(){
        ArrayList<ProfesorTitular> pi = new ArrayList<ProfesorTitular>();

        try {
            FileInputStream fis = new FileInputStream("profestitulares.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);

            pi = (ArrayList<ProfesorTitular>) ois.readObject();

            ois.close();
            fis.close();

        } catch (Exception e) {
            System.out.println("Error al conseguir a los profes titulares..."+e);
        }

        return pi;
    }

}

В конце попыткиcatch бросает меня

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2950)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1534)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427)
at profesores.Serializacion.conseguirTodosProfesTitulares(Serializacion.java:69)
at profesores.Serializacion.agregarProfeTitular(Serializacion.java:46)

Идея состоит в том, что когда я хочу сначала записать некоторые данные в свой файл, я получаю уже существующие данные, анализируя их как массив, а затем возвращаю этот список и просто добавляюновые данные.Он работает, записывая файл, но чтение его не работает.

РЕДАКТИРОВАТЬ:

Это код класса, который я пытаюсь сериализовать:

public class ProfesorTitular extends Profesor {

    int horasBase;

    public ProfesorTitular(int id, String nombre, String clase, int horasBase) {
        super(id, nombre, clase);
        this.horasBase = horasBase;
    }

    public int getHorasBase() {
        return horasBase;
    }

    public void setHorasBase(int horasBase) {
        this.horasBase = horasBase;
    }


}

1 Ответ

0 голосов
/ 04 июня 2018
  1. Вы создаете FileOutputStream для файла с очень плохим именем profestitulares.txt.Сериализованные данные не являются текстовыми и не должны сохраняться в файлах с расширением .txt.
  2. Это создает пустой файл.
  3. Затем вы создаете ObjectOutputStream вокруг этого потока, который записываетзаголовок потока объекта.
  4. Затем вы создаете FileInputStream для того же файла, который теперь является пустым, кроме заголовка потока объекта, каким бы ни было его состояние ранее.
  5. Затем вы пытаетесьсоздать ObjectInputStream вокруг этого, что не удается, поскольку в этом логически пустом файле есть заголовок потока, но нет объектов.

Решение: прочитайте объекты из файла перед созданием нового.

...