java - 通过 ObjectOutputStream 发送相同但已修改的对象

标签 java io 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<Integer> same = new ArrayList<Integer>();
                    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()方法。

关于java - 通过 ObjectOutputStream 发送相同但已修改的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61320457/

相关文章:

Java swing 客户端服务器问题

java - 在 ArrayList 中添加重复项

java - 有没有一种方法可以从不同的包(或类)运行一个定义的和 X 个随机 TestNG 测试?

java - 一个应用程序中的两个单例 - 都具有不同的 @Scheduled 方法 - 一个类方法等待另一个?

java - 如何使用 Java 在浏览器中启动文件下载?

java - 使用 ObjectOutputStream 保存 HashMap

Java ObjectOutputStream 未写入 ZipEntry

java - 无法更改 Spring 安全访问被拒绝的标准响应

c - fscanf 和 fprintf 在 C 中缓冲吗?

io - 如何在 C 中调用 execvp 后将错误消息传递给文件