0

状況をレイアウトします。質問は一番下にあります。

私は次のようなオブジェクトを持っています:

public class GameObject implements Serializable{
/**
 * 
 */
    private static final long serialVersionUID = 3081889342394131807L;
    public float x, y, vx, vy;
    public int size;
    public int mass;

    public GameObject()
    {
        Random rand = new Random();
        x = rand.nextInt(400);
        y = rand.nextInt(400);
        size = rand.nextInt(10);
        mass = size * size * size;
        vx = 0.3f;
        vy = 0.3f;
    }

    public void updateGameObject()
    {
        x+=vx;
        y+=vy;
    }
}

ソケットを使用してクライアント サーバーをセットアップしました。サーバーが起動すると、GameObject が作成され、HashMap に追加されます。次に、サーバーはループし、オブジェクトを更新して、更新されたオブジェクトを送信します。接続は標準ソケットです。

while (true)
{
    gameObject.updateGameObject();
    try {
        if (objOutputStream == null)
            objOutputStream = new ObjectOutputStream(connection.getOutputStream());
        objOutputStream.writeObject(o);
        objOutputStream.flush();
    } catch (Exception e) { e.printStackTrace(); }
}

クライアント側では、オブジェクトを読み取って画面に描画するだけです。ここで問題が発生します。ループごとに確実にオブジェクトを受け取っていますが、それを読んでもゲームオブジェクトのフィールドが変化していないようです。

while (true)
{
    try {
            if (objInputStream == null)
                objInputStream = new ObjectInputStream(connection.getInputStream());
            return objInputStream.readObject();
        } catch (Exception e) { e.printStackTrace(); }
}

objInputStream と objOutputStream は両方とも while ループの上で初期化されます。

クライアントで取得しているオブジェクトの x 値と y 値に対して println() を実行すると、値が初期値から変化することはありません。

サーバーの x 値と y 値を送信する直前に println() を実行すると、正しい値が出力されます。そのようなもの:

Sending Object with 1, 1
Received Object with 1, 1
Sending Object with 2, 2
Received Object with 1, 1
Sending Object with 3, 3
Received Object with 1, 1

何か基本的なものが欠けているように感じます。この問題で他の質問を見つけようとすると、見つけられないようです。多分あなたの一人が私にいくつかの洞察を提供できますか?

4

2 に答える 2

1

ObjectOutputStream以前に書き込んだオブジェクトをストリームに再書き込みしないことで、オブジェクトの複雑なグラフのシリアル化を簡単にしようとします ( ではなく、参照の等価性によって決定されますequals())。

怠惰な解決策は、送信する前にオブジェクトを実装するCloneableことです-しかし、完全に古いJDKを使用していない限り、代わりclone()に呼び出すことをお勧めします.writeUnshared()前のバージョン。

于 2013-11-09T20:41:12.983 に答える