首页 > 解决方案 > 序列化和反序列化同一个对象并不反映它的状态变化

问题描述

当我尝试序列化一个对象以多次反序列化它时。在第一次尝试中,它工作正常。但是从我第二次运行上述代码更改对象的属性开始,它们在文件中没有更改。既不覆盖也不附加。

import java.io.*;
import java.util.ArrayList;

public class FileWrite {
static String es="EmailSave.txt";

    public static void writeTo(String name, String line) throws IOException {
        File OfficeRes = new File(name);
        BufferedWriter bw = new BufferedWriter(new FileWriter(OfficeRes, true));
        bw.append(line);
        bw.append("\n");
        bw.close();
    }

    public static void serializeTo(String file, Serializable s) throws IOException {
        FileOutputStream f = new FileOutputStream(file, true);
        ObjectOutputStream os = new ObjectOutputStream(f);
        os.writeObject(s);
        os.close();
    }

    public static Object deserializeFrom(String file) throws IOException, ClassNotFoundException {
        //assumption: file only has one serialized object
        FileInputStream f = new FileInputStream(file);
        ObjectInputStream obj = new ObjectInputStream(f);

        Object a=obj.readObject();
        obj.close();
        return a;
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        OfficialRecipient a1=new OfficialRecipient();
        OfficialFriend a2=new OfficialFriend();
        PersonalRecipient a3=new PersonalRecipient();
        OfficialFriend a4=new OfficialFriend();
        a4.designation="tghfgbrb";
        a3.name="bhuvuycghchg";
        a1.email="bygygygyg";
        ArrayList<Recipient> a=new ArrayList<>();
        a.add(a1);
        a.add(a2);
        a.add(a3);
        a.add(a4);
        serializeTo(es, a);
        System.out.println(deserializeFrom(es));
    }

}

标签: javaserializationdeserializationfilestreamobjectoutputstream

解决方案


问题是您要附加到输出文件而不是覆盖。然后,当您从文件中读取时,您将获得第一个对象,这是最旧的对象。

当你这样做时:new FileWriter(file, true)第二个参数true导致FileWriter附加到文件中。

您需要将其false用作第二个参数,以便每次运行时都会覆盖文件中的数据,而不是追加:

new FileOutputStream(file, false);


推荐阅读