Отправка того же, но modifed возражает по ObjectOutputStream

У меня есть следующий код, который показывает или ошибку или недоразумение с моей стороны.

Я отправил тот же список, но изменил по ObjectOutputStream. Однажды как [0] и другой как [1]. Но когда я считал его, я добираюсь [0] дважды. Я думаю, что это вызывается тем, что я отправляю по тому же объекту, и ObjectOutputStream должен кэшировать их так или иначе.

Состоит в том эта работа, как она должна, или действительно ли я должен зарегистрировать ошибку?

import java.io.*;
import java.net.*;
import java.util.*;

public class OOS {

    public static void main(String[] args) throws Exception {
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    ServerSocket ss = new ServerSocket(12344);
                    Socket s= ss.accept();

                    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                    List same = new ArrayList();
                    same.add(0);
                    oos.writeObject(same);
                    same.clear();
                    same.add(1);
                    oos.writeObject(same);

                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();

        Socket s = new Socket("localhost", 12344);
        ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

        // outputs [0] as expected
        System.out.println(ois.readObject());

        // outputs [0], but expected [1]
        System.out.println(ois.readObject());
        System.exit(0);
    }
}
20
задан Eddie 28 February 2009 в 17:41
поделиться

3 ответа

Поток имеет ссылочный график, таким образом, объект, который отправляется дважды, не даст два объекта на другом конце, Вы только получите тот. И отправка того же объекта дважды отдельно приведет Вам тот же пример дважды (каждый с теми же данными - который является тем, что Вы видите).

Видят сброс () метод, если Вы хотите сбросить график.

27
ответ дан 30 November 2019 в 00:40
поделиться

Max корректен, но можно также использовать:

public void writeUnshared(Object obj);

См. комментарий ниже для протеста

6
ответ дан 30 November 2019 в 00:40
поделиться

То, что Вы, вероятно, хотите:

ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
oos.flush();  // flush the stream here
same.clear();
same.add(1);
oos.writeObject(same);

Иначе тот же объект будет сброшен дважды, когда поток будет закрыт, или его буфер заканчивается.

Просто к вашему сведению, когда Вы десериализовываете объекты в, скажем, o1 и o2, o1 != o2.

-4
ответ дан 30 November 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: