Sending the same but modifed object over ObjectOutputStream
我有以下代码,显示了我的错误或误解。
我发送了相同的列表,但在ObjectOutputstream上进行了修改。一次为[0],另一次为[1]。但当我读到它的时候,我得到了两次。我认为这是由于我正在发送相同的对象,而objectOutputstream必须以某种方式缓存它们。
这是应该的工作,还是应该提交一个bug?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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()方法。
max是正确的,但您也可以使用:
1 |
有关警告,请参阅下面的注释。
你可能想要的是:
1 2 3 4 5 6 7 8 | 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); |
否则,当流关闭或缓冲区耗尽时,同一对象将被刷新两次。
仅供参考,当您将对象反序列化为,例如