Сбросить ObjectOutputStream для обновления нового состояния объекта?

#java #reset #objectoutputstream

#java #Сброс #objectoutputstream

Вопрос:

Я хочу сбросить ObjectOutputStream для обновления нового состояния объекта. Но почему это не влияет. Приведенный ниже код выводит «ДО» вместо «ПОСЛЕ»? Что не так с моим кодом?

 
package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Serialization {
    public static void main(String[] strs) {
        String filename = "E:\myObject.data";

        FileOutputStream fos = null;
        ObjectOutputStream out = null;
        MyObject myObject = new MyObject();
        try {

            myObject.setValue("BEFORE");
            fos = new FileOutputStream(filename);
            out = new ObjectOutputStream(fos);
            out.writeObject(myObject);
            out.reset();
            myObject.setValue("AFTER");
            out.writeObject(myObject);
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        try {
            FileInputStream fis = null;
            ObjectInputStream in = null;
            fis = new FileInputStream(filename);
            in = new ObjectInputStream(fis);
            myObject = (MyObject) in.readObject();
            System.out.println(myObject.getValue());
            in.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
    }

    public static class MyObject implements Serializable {

        private static final long serialVersionUID = 5222199410120362372L;
        private String value;

        public void setValue(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
}

  

введите описание изображения здесь

Ответ №1:

Вы записываете две копии объекта, но читаете только одну. Если вы прочитаете два объекта, вы увидите ДО и ПОСЛЕ.

Комментарии:

1. Да, вы правы. Но меня смущает объяснение в этой статье java.sun.com/developer/technicalArticles/Programming /… (в разделе «Кэширование объектов в потоке»)

2. Попробуйте тот же тест без reset(), и вы увидите разницу.

3. Море .. ваша ссылка не работает. Это та же статья, на которую вы ссылаетесь?

4. На самом деле эта ссылка тоже неплохо подходит для чтения по этому вопросу. Автор тестирует производительность различных подходов к использованию ObjectOutputStream. К сожалению, он пропустил тестирование метода writeUnshared и еще одного подхода, который заключался бы в создании нового ObjectOutputStream вместо простого сброса кэша.