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

Posted

技术标签:

【中文标题】通过 ObjectOutputStream 发送相同但已修改的对象【英文标题】:Sending the same but modifed object over ObjectOutputStream 【发布时间】:2010-09-13 15:03:45 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

public void writeUnshared(Object obj);

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

【讨论】:

这在这种情况下会起作用,但通常会导致非常奇怪的错误。任何写入的组件对象仍将被共享。因此,例如,如果上面的列表是用 Collections.synchronizedList 包装的,那么问题仍然存在。 writeUnshared 不是很有用。

以上是关于通过 ObjectOutputStream 发送相同但已修改的对象的主要内容,如果未能解决你的问题,请参考以下文章

通过 ObjectOutputStream 发送文件,然后将其保存在 Java 中?

当两个客户端向服务器发送对象时,ObjectOutputStream writeObject 挂起

Android Socket + ObjectOutputStream 无法正常工作

如何通过 java 套接字发送 Json 对象?

通过 ObjectStreams 发送的对象不保留其字段值?

Java 保存对象到文件并恢复 ObjectOutputStream/ObjectInputStream