发送相同的,但体改对象上的ObjectOutputStream(Sending the same b

2019-07-18 00:30发布

我有以下的代码,显示无论是bug还是我的一个误解。

我发出同样的名单,但改性,一个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);
    }
}

Answer 1:

流有一个参考图表,所以其发送两次不会给在另一端有两个对象的对象,你只会得到一个。 并分别两次发送相同的对象会给你同一个实例两次(每次使用相同的数据 - 这是你看到的)。

如果要重置图中看到的reset()方法。



Answer 2:

Max是正确的,但你也可以使用:

public void writeUnshared(Object obj);

请参阅下面的评论警告



Answer 3:

你可能想要的是:

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);

否则相同的对象将被两次当流被关闭或冲洗它的缓冲区耗尽。

仅供参考,当你反序列化的对象为,假设o1o2o1 != o2



文章来源: Sending the same but modifed object over ObjectOutputStream