Java 序列化/反序列化ArrayList

Java 序列化/反序列化ArrayList,java,serialization,arraylist,Java,Serialization,Arraylist,我正在构建一个Java项目,我需要序列化和反序列化项目的ArrayList,我不能使用ArrayList,但我必须使用ArrayList的每个元素。不知何故,我成功地将其序列化,但每当我尝试对其进行反序列化时,我都会得到以下结果: java.lang.IndexOutOfBoundsException:索引:0,大小:0 代码如下: File f = new File("testo2.txt"); int i = 0; ArrayList<DispositivoSe

我正在构建一个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();
    }
File f=新文件(“testo2.txt”);
int i=0;
ArrayList=新建ArrayList();
如果(f.exists())
{
ObjectInputStream in=新ObjectInputStream(新文件InputStream(f));
while(in.read()!=-1)
{
在.readObject()中添加((DispositivoSelezioneProgrammi);
}
}
其他的
{
ObjectOutputStream out=新的ObjectOutputStream(新文件OutputStream(f));
PROGRAMA prog1=新的PROGRAMA(“Lana”);
PROGRAMA prog2=新的PROGRAMA(“Seta”);
PROGRAMA prog3=新程序(“Rapido”);
ArrayList lista=新的ArrayList();
列表a.add(0,prog1);
增加(1,程序2);
增加(2,程序3);
Lavatrice lav1=新的Lavatrice(“Asd”、“lol”、lista);
Lavatrice lav2=新的Lavatrice(“Fgh”、“kok”、lista);
Lavatrice lav3=新的Lavatrice(“Jkl”,“pop”,lista);
Canzone canz1=新Canzone(“贝拉”);
Canzone canz2=新Canzone(“Brutta”);
Canzone canz3=新Canzone(“Qwerty”);
ArrayList canz=新的ArrayList();
canz.add(0,canz1);
canz.添加(1,canz2);
canz.add(2,canz3);
LETTOREM3 lett1=新的LETTOREM3(“lett1”);
lett1.荷载(canz);
LETTOREM3 lett2=新LETTOREM3(“lett2”);
lett2.荷载(canz);
LETTREMP3 lett3=新的LETTREMP3(“lett3”);
lett3.荷载(canz);
列表。添加(0,lav1);
列表。添加(1,lav2);
列表。添加(2,lav3);
列表。添加(3,lett1);
列表。添加(4,lett2);
列表。添加(5,第3部分);
用于(DispositivoSelezioneProgrammi disp:list)
{               
out.writeObject(disp);
}
out.close();
}
你能帮帮我吗?我不明白发生了什么!
我差点忘了,Lavatrice和LettoreMP3实现了DispositvoSelezioneProgrammi接口,这就是为什么我使用它作为超级类型来序列化它们

ArrayList是可序列化的,在反序列化时,您应该直接写入/读取它,因为您已经创建了一个空的ArrayList
列表
。您不能尝试使用
list.set(i,…)添加元素;i++!而是使用
列表。添加(…)

有关详细信息,请参阅。

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

现在我修复了它,上面是新代码。现在我遇到了另一个问题,如果文件不存在,它会正常工作,并序列化数据,但如果文件存在,它不会执行任何操作,并且会在没有错误但没有显示任何内容的情况下终止!