通过ObjectOutputStream发送相同但已修改的对象
我有下面的代码,显示我的一个错误或误解。
我发送了相同的列表,但通过ObjectOutputStream进行了修改。 一次为[0]和其他为[1]。 但是当我读它的时候,我得到了两次。 我认为这是由于我发送相同的对象和ObjectOutputStream必须以某种方式caching这一事实造成的。
这是工作,因为它应该,或者我应该提交一个错误?
import java.io. *; import java.net。*; import java.util。*; 公开课OOS { 公共静态无效的主要(string[]参数)抛出exception{ 线程t1 =新的线程(新的Runnable(){ public void run(){ 尝试{ 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.clear(); same.add(1); oos.writeObject(相同); catch(Exception e){ e.printStackTrace(); } } }); t1.start(); Socket 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); } }
stream有一个参考图,所以发送两次的对象不会给另一端两个对象,你只会得到一个。 分别发送同一个对象两次会给你两次相同的实例(每个都有相同的数据 – 这就是你所看到的)。
如果要重置graphics,请参阅reset()方法。
最大是正确的,但你也可以使用:
public void writeUnshared(Object obj);
请注意下面的注意事项
ObjectOutputStreamcaching通过线路发送的实例(不一定是最好的devisetbh)。 但是无论如何,如果您打算使用它来(重新)发送相同的对象实例,则需要重置输出stream之间的调用。
public void reset()抛出IOException
重置将忽略已写入stream的任何对象的状态。 状态被重置为与新的ObjectOutputStream相同。 stream中的当前点被标记为重置,因此相应的ObjectInputStream将在同一点重置。 以前写入stream的对象不会被认为已经在stream中。 他们将再次被写入stream中。
你可能想要的是:
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);
否则当streamclosures或缓冲区用完时,同一个对象将被刷新两次。
只是供参考,当你反序列化的对象,让我们说o1
和o2
, o1 != o2
。