1

私は自分のコードで非常に奇妙な状況を抱えていますが、それは理解できません。オブジェクトを送信しています。たとえば、ソケットを介してOを送信します。次に、オブジェクトの変数の値を変更して、再度送信しますが、2回目に印刷しますクライアント側では、最初のオブジェクトと同じ値を取得しています。

クライアントコード:

 while(true){
             try{
             order=(Order)ois.readObject();

            System.out.println(order);

             }

サーバーコード:

public void sendOrder(Order o){
    try {
        out.writeObject(o);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

主な方法:

Server_Socket ss=new Server_Socket();
    ss.sendOrder(o);
    o.add(r2);
    ss.sendOrder(o);

送信する前にサーバー側で値が確実に変化していますが、クライアント側で r2 がオブジェクトに追加されたことが表示されない理由がわかりません。

4

2 に答える 2

5

オブジェクトは によってキャッシュされていObjectOutputStreamます。これを防ぐにはObjectOutputStream.reset()、各書き込み後に呼び出します。他のオブジェクトを含まない単純なオブジェクトを送信する場合は、writeUnshared()代わりにwriteObject().

于 2012-09-26T01:46:29.280 に答える
0

オブジェクトは IOStreams によってキャッシュされています。これを修正するには、オブジェクトを送り返す前に、サーバー上でディープ クローンを作成します。クライアントがストリームからオブジェクトをプルすると、インスタンス ID が異なり、クライアント側でオブジェクトを実際に逆シリアル化し、インスタンス化します。

楽しいもの。

于 2012-09-26T01:44:32.730 に答える