3

ObjectOutputStreamとObjectInputStreamを使用して、作成しているサーバーとクライアントのオブジェクトをシリアル化および逆シリアル化することに成功しました。サーバーとクライアントは通常2つの異なるマシン上にありますが、ターンベースのカードゲームになるため、ユーザーにもローカルでプレイしてもらい、クライアントとサーバーの両方を同じマシンで実行するようにします。

今、私は自分の接続インターフェースの代替実装を書いています。インターフェイスには、void sendToServer(Object)やObject receiveFromServer()などのメソッドが含まれています

通常、sendToServer(Object)関数はObjectOutputStreamを介してオブジェクトを送信するだけですが、オブジェクトは同じマシン上にあるため、オブジェクトのキューを作成し、送信または受信が呼び出されるたびにプッシュおよびポップすることができます。ただし、問題は、サーバーが使用するオブジェクトへの参照をクライアントに持たせたくないということです。それをコピーにしたいのです。そして、私はコピーコンストラクターを持っておらず、オブジェクトはクローン化できません。

私の状況であなたはどうしますか?

4

2 に答える 2

5

ByteArrayInputStream と ByteArrayOutputStream を見てください。それらを使用して、オブジェクトをメモリにシリアル化し、それらを元に戻します。

ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(new Jedi("Obiwan"));
out.close();

byte[] payload = bOut.toByteArray();

ByteArrayInputStream bIn = new ByteArrayInputStream(payload);
ObjectInputStream in = new ObjectInputStream(bIn);
Jedi jedi = (Jedi) in.readObject();
in.close();

System.out.println(jedi);

この場合、バイトをネットワーク経由で送信する代わりに、メモリ構造を使用してバイトを配置できます。

それが役立つことを願っています!

于 2012-03-19T17:58:20.657 に答える
0

通常、sendToServer(Object) 関数は ObjectOutputStream を介してオブジェクトを送信するだけですが、オブジェクトは同じマシン上にあるため、オブジェクトのキューを作成し、送信または受信が呼び出されるたびにプッシュおよびポップすることができます ...

しかし、それはあなたが説明したすべての問題につながります。では、なぜ何かをするのですか?そのままにしておいてください。

于 2012-03-19T23:18:15.607 に答える