当前位置:  开发笔记 > 编程语言 > 正文

在ObjectOutputStream上发送相同但已修改的对象

如何解决《在ObjectOutputStream上发送相同但已修改的对象》经验,为你挑选了2个好方法。

我有以下代码,显示我的错误或误解.

我发送了相同的列表,但修改了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);
    }
}

Max Stewart.. 27

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

如果要重置图形,请参阅reset()方法.



1> Max Stewart..:

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

如果要重置图形,请参阅reset()方法.



2> Pyrolistical..:

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

public void writeUnshared(Object obj);

请参阅下面的评论以获取警告


这将适用于这种情况,但通常会导致非常奇怪的错误.写入的任何组件对象仍将被共享.因此,例如,如果上面的List包含在Collections.synchronizedList中,则问题仍然存在.writeUnshared不是很有用.
推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有