当前位置: 首页 > 知识库问答 >
问题:

对象序列化和反序列化使用ArrayList在Java

阎庆
2023-03-14

我试图序列化一个对象数组,并将其写入一个名为address.ser的文件,然后从该文件中读取,反序列化对象数组并显示其属性。我尝试一次序列化整个arrayList(读取时在单个会话中反序列化它),也尝试一个接一个地序列化对象数组的每个对象(读取时一个接一个地反序列化它)。问题是,当从address.ser文件读回来时,我只得到最后一个被写入的对象的数据,而不是其他的。

以下是代码片段:

Employee[] a=new Employee[5];

    List<Employee> arr=new ArrayList<Employee>();

    for(int i=0;i<=4;i++)
    {
    a[i]=new Employee();
    System.out.println("Enter name,age,height,weight,house_no:");
    a[i].name=sc.next();
    a[i].age=sc.nextInt();
    a[i].height=sc.nextDouble();
    a[i].weight=sc.nextDouble();
    a[i].house_no=sc.nextInt();
    arr.add(a[i]);
    }

这是用于将对象写入地址的代码段。ser:

for(int i=0;i<=4;i++)
    {
    try
    {
    fout = new FileOutputStream("e:\\address.ser");
    oos = new ObjectOutputStream(fout);   
    oos.writeObject(a[i]);
    //oos.writeChars("\n");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
    oos.close();
    fout.close();
    }
    }

这是从address.ser读取对象的代码片段:

List<Employee> recordList=new ArrayList<Employee>();
    for(int i=0;i<=4;i++)
    {
    try
    {
        file = new FileInputStream("e:\\address.ser");
        input = new ObjectInputStream (file);

        //deserialize the List
        Employee readCase=(Employee) input.readObject();
        recordList.add(readCase);
        System.out.print("Employee "+i+" ");
        System.out.print((recordList.get(i).name)+" ");
        System.out.print((recordList.get(i).age)+" ");
        System.out.print((recordList.get(i).height)+" ");
        System.out.print((recordList.get(i).weight)+" ");
        System.out.print((recordList.get(i).house_no)+" ");
        System.out.println();

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
    file.close();
    input.close();
    }
    }

最终输出为:

共有3个答案

慎俊艾
2023-03-14

校正溶液

您正在为尝试序列化的每个元素覆盖文件。因此,最后一个序列化的元素仍然存在。序列化数据的文件有一个头,因此必须一次性写入数据。

fout = new FileOutputStream("e:\\address.ser");
oos = new ObjectOutputStream(fout);   
for(int i=0;i<=4;i++)
{
     try
     {
        oos.writeObject(a[i]);
     }catch(Exception e){}
}

然而,一次序列化整个列表更有效。

邢飞鸿
2023-03-14

问题是您试图以错误的方式写入对象。您正在将ArrayList的每个元素写入同一个文件中。因此,正在发生的是一种新的元素正在取代旧的元素。所以一次写下全部清单,liek

oos.writeObject(yourList);
林国安
2023-03-14

这就是方法,

public class Test {
    public static void main(String[] args) {
Employee employee=new Employee("jhon");
Employee employee2=new Employee("jojo");
Employee employee3=new Employee("albin");
ArrayList<Employee> list=new ArrayList<Employee>();
list.add(employee);
list.add(employee2);
list.add(employee3);

try {
    FileOutputStream outputStream=new FileOutputStream("add.ser");
    ObjectOutputStream objectOutputStream= new ObjectOutputStream(outputStream);
    objectOutputStream.writeObject(list);
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}


try {
    FileInputStream inputStream=new FileInputStream("add.ser");
    ObjectInputStream objectInputStream =new ObjectInputStream(inputStream);
    ArrayList<Employee> list2=(ArrayList<Employee>) objectInputStream.readObject();
    for (Employee employee4 : list2) {
        System.out.println(employee4.getName());
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
    }
}
 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 我的项目是关于图书馆管理系统的。我必须将数据存储到类的对象中,然后将它们存储到ArrayList中。然后我在序列化数据。 我有这些功能: null 我用来反序列化的代码: 我得到了一个异常,因为BufferedReader需要是瞬态的,这是修复的。但现在,我认为我的序列化不起作用了。每次我创建一本书,我都将它的索引(对象编号)存储在一个文本文件中。我的搜索技术都不起作用:ArrayIndexOut

  • 问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:

  • 我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列