通过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 。