Сериализация и десериализация одного и того же объекта не отражает его изменение состояния - PullRequest
0 голосов
/ 21 сентября 2018

Когда я пытался сериализовать объект, чтобы десериализовать его несколько раз.С первых попыток работает нормально.Но со второго раза, когда я запускаю приведенный выше код, меняя атрибуты объектов, они не меняются в файле.Ни переопределено, ни добавлено.

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

}

1 Ответ

0 голосов
/ 22 сентября 2018

Проблема в том, что вы добавляете файл вывода, а не перезаписываете.Затем, когда вы читаете из файла, вы получаете первый объект, который является самым старым.

При этом: new FileWriter(file, true) второй параметр true вызывает добавление FileWriter к файлу.

Вам необходимо использовать false в качестве второго параметра, так чточто при каждом запуске он будет перезаписывать данные в файле, а не добавляться:

new FileOutputStream(file, false);

...