使用readObject()反序列化ArrayList的EOFException

时间:2018-06-04 01:21:53

标签: java arraylist serialization

我试图使用继承来序列化类中的实例。

这是我尝试序列化数据的类

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;
    }

}

最后,try-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)

我的想法是,当我想首先在我的文件中写入一些数据时,我得到已经存在的数据,将其解析为arraylist,然后我返回该arraylist,我只是添加新数据。它可以正常编写文件,但阅读它不起作用。

编辑:

这是我尝试序列化的类代码:

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 :(得分:0)

  1. 您为名称很差的文件FileOutputStream创建profestitulares.txt。序列化数据不是文本,不应保存在扩展名为.txt的文件中。
  2. 这会创建一个空文件。
  3. 然后围绕此流创建ObjectOutputStream,写入对象流标题。
  4. 然后为同一个文件创建一个FileInputStream,除了对象流标题之外,它现在是空的,无论它以前的状态如何。
  5. 然后尝试在此周围创建ObjectInputStream,但失败了,因为此逻辑空文件中有一个流标题但没有对象。
  6. 解决方案:在创建新文件之前从文件中读取对象。