23

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

我发送了相同的列表,但通过 ObjectOutputStream 进行了修改。一次为 [0],其他为 [1]。但是当我阅读它时,我得到 [0] 两次。我认为这是因为我通过同一个对象发送并且 ObjectOutputStream 必须以某种方式缓存它们。

这是应有的工作,还是我应该提交错误?

导入java.io.*;
导入java.net.*;
导入 java.util.*;

公共类OOS {

    公共静态 void main(String[] args) 抛出异常 {
        线程 t1 = 新线程(新可运行(){
            公共无效运行(){
                尝试 {
                    ServerSocket ss = 新的 ServerSocket(12344);
                    套接字 s= ss.accept();

                    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                    列表相同 = new ArrayList();
                    相同的.add(0);
                    oos.writeObject(相同);
                    相同的.clear();
                    相同的.add(1);
                    oos.writeObject(相同);

                } 捕捉(异常 e){
                    e.printStackTrace();
                }
            }
        });
        t1.start();

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

        // 按预期输出 [0]
        System.out.println(ois.readObject());

        // 输出 [0],但预期为 [1]
        System.out.println(ois.readObject());
        System.exit(0);
    }
}
4

2 回答 2

31

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

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

于 2008-09-26T22:32:27.157 回答
7

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

public void writeUnshared(Object obj);

请参阅下面的评论以获取警告

于 2008-09-27T01:26:48.233 回答