通过ObjectOutputStream发送相同但已修改的对象
时间:2020-03-06 14:48:44 来源:igfitidea点击:
我有以下代码显示了我的错误或者误解。
我发送了相同的列表,但是在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); } }
解决方案
流具有一个参考图,因此发送两次的对象不会在另一端给出两个对象,我们只会得到一个。分别发送两次相同的对象将给我们两次相同的实例(每个实例都具有我们所看到的相同数据)。
如果要重置图形,请参见reset()方法。
我们可能想要的是:
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);
否则,当关闭流或者它的缓冲区用尽时,同一对象将被刷新两次。
仅供参考,当我们将对象反序列化为" o1"和" o2"时,说" o1!= o2"。
Max是正确的,但我们也可以使用:
public void writeUnshared(Object obj);
请注意以下注释