通过 ObjectOutputStream 发送相同但经过修改的对象

2022-09-01 22:59:24

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

我发送了相同的列表,但通过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);
    }
}

答案 1

流有一个参考图,所以发送两次的对象不会在另一端给出两个对象,你只会得到一个。单独发送同一对象两次将为您提供两次相同的实例(每个实例具有相同的数据 - 这就是您所看到的)。

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


答案 2

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

public void writeUnshared(Object obj);

请参阅下面的评论以了解注意事项


推荐