23

私の側のバグまたは誤解を示す次のコードがあります。

同じリストを送信しましたが、ObjectOutputStream を変更しました。1 回は [0]、それ以外は [1] です。しかし、読んでみると [0] が 2 回出てしまいます。これは、同じオブジェクトを送信していて、ObjectOutputStream が何らかの方法でそれらをキャッシュしている必要があるという事実が原因だと思います。

これは正常に機能しますか、それともバグを報告する必要がありますか?

java.io.* をインポートします。
java.net.* をインポートします。
import java.util.*;

公開クラス OOS {

    public static void main(String[] args) throws Exception {
        スレッド t1 = 新しいスレッド (新しい Runnable() {
            public void run() {
                試す {
                    ServerSocket ss = 新しい ServerSocket(12344);
                    ソケット s= ss.accept();

                    ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
                    同じリスト = 新しい ArrayList();
                    同じ.追加(0);
                    oos.writeObject(同じ);
                    同じ.clear();
                    同じ.add(1);
                    oos.writeObject(同じ);

                キャッチ(例外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);
    }
}
4

2 に答える 2

31

ストリームには参照グラフがあるため、2回送信されたオブジェクトは、もう一方の端に2つのオブジェクトを提供せず、1つだけを取得します。また、同じオブジェクトを2回別々に送信すると、同じインスタンスが2回提供されます(それぞれが同じデータを使用します。これが表示されます)。

グラフをリセットする場合は、reset()メソッドを参照してください。

于 2008-09-26T22:32:27.157 に答える
7

Max は正しいですが、次のものも使用できます。

public void writeUnshared(Object obj);

警告については、以下のコメントを参照してください

于 2008-09-27T01:26:48.233 に答える