我有以下代码,显示我的错误或误解。
我发送了相同的列表,但是修改了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); } }
答案 0 :(得分:26)
流有一个参考图,所以一次发送的对象不会在另一端给出两个对象,你只能获得一个。分别发送两次相同的对象会给你两次相同的实例(每个都有相同的数据 - 这就是你所看到的)。
如果要重置图形,请参阅reset()方法。
答案 1 :(得分:6)
Max是正确的,但您也可以使用:
public void writeUnshared(Object obj);
请参阅下面的评论以获取警告
答案 2 :(得分:-4)
你可能想要的是:
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
。