【问题标题】:Serialize/Deserialize an ArrayList序列化/反序列化 ArrayList
【发布时间】:2014-01-28 10:29:48
【问题描述】:

我正在构建一个 Java 项目,我需要序列化和反序列化项目的 ArrayList,我不能用 ArrayList 来做,但我必须用 ArrayList 的每个元素来做。不知何故,我设法序列化它,但每当我尝试反序列化它时,我都会得到这个: java.lang.IndexOutOfBoundsException:索引:0,大小:0

代码如下:

    File f = new File("testo2.txt");
    int i = 0;
    ArrayList<DispositivoSelezioneProgrammi> list = new ArrayList<DispositivoSelezioneProgrammi>();
    if(f.exists())
    {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(f));

        while(in.read() != -1)
        {
            list.add((DispositivoSelezioneProgrammi)in.readObject());

        }
    }
    else
    {

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f));
        Programma prog1 = new Programma("Lana");
        Programma prog2 = new Programma("Seta");
        Programma prog3 = new Programma("Rapido");
        ArrayList<Programma> lista = new ArrayList<Programma>();
        lista.add(0,prog1);
        lista.add(1,prog2);
        lista.add(2,prog3);
        Lavatrice lav1 = new Lavatrice("Asd","lol",lista);
        Lavatrice lav2 = new Lavatrice("Fgh","kok",lista);
        Lavatrice lav3 = new Lavatrice("Jkl","pop",lista);

        Canzone canz1 = new Canzone("Bella");
        Canzone canz2 = new Canzone("Brutta");
        Canzone canz3 = new Canzone("Qwerty");
        ArrayList<Canzone> canz = new ArrayList<Canzone>();
        canz.add(0,canz1);
        canz.add(1,canz2);
        canz.add(2,canz3);
        LettoreMP3 lett1 = new LettoreMP3("Lett1");
        lett1.load(canz);
        LettoreMP3 lett2 = new LettoreMP3("Lett2");
        lett2.load(canz);
        LettoreMP3 lett3 = new LettoreMP3("Lett3");
        lett3.load(canz);

        list.add(0,lav1);
        list.add(1,lav2);
        list.add(2,lav3);
        list.add(3,lett1);
        list.add(4,lett2);
        list.add(5,lett3);
        for(DispositivoSelezioneProgrammi disp : list)
        {               
            out.writeObject(disp);
        }
        out.close();
    }

你能帮帮我吗?我不明白会发生什么! 我差点忘了,Lavatrice 和 LettoreMP3 实现了 DispositvoSelezioneProgrammi 接口,这就是为什么我用它作为超类型来序列化它们!

【问题讨论】:

    标签: java serialization arraylist


    【解决方案1】:

    ArrayList 是可序列化的,你应该直接写/读它

    【讨论】:

      【解决方案2】:

      反序列化时,您创建了一个空的 ArrayList list。千万不要尝试使用list.set(i, ...); i++; 添加元素!而是使用list.add(...)。 详情请见http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

      【讨论】:

        【解决方案3】:

        您使用了错误的信号指示器来检测流是否有要读取的数据。在 while 语句中使用 -1 而不是 1

        【讨论】:

        • 现在我修好了,上面有新代码。现在我有另一个问题,如果文件不存在它可以正常工作,并序列化数据,但如果文件存在它不做任何事情,并且没有错误但没有显示任何内容!