关于java:在ObjectOutputStream上发送相同但修改过的对象

Sending the same but modifed object over ObjectOutputStream

我有以下代码,显示了我的错误或误解。

我发送了相同的列表,但在ObjectOutputstream上进行了修改。一次为[0],另一次为[1]。但当我读到它的时候,我得到了两次。我认为这是由于我正在发送相同的对象,而objectOutputstream必须以某种方式缓存它们。

这是应该的工作,还是应该提交一个bug?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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);
    }
}

流有一个引用图,所以一个被发送两次的对象不会在另一端给出两个对象,您只会得到一个。分别发送同一个对象两次会给同一个实例两次(每个实例都有相同的数据——这就是您看到的)。

如果要重置图形,请参见reset()方法。


max是正确的,但您也可以使用:

1
public void writeUnshared(Object obj);

有关警告,请参阅下面的注释。


你可能想要的是:

1
2
3
4
5
6
7
8
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);

否则,当流关闭或缓冲区耗尽时,同一对象将被刷新两次。

仅供参考,当您将对象反序列化为,例如o1o2o1 != o2