通过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或缓冲区用完时,同一个对象将被刷新两次。

只是供参考,当你反序列化的对象,让我们说o1o2o1 != o2