2012-03-19 12 views
2

私は執筆中のサーバーとクライアントのオブジェクトを直列化および逆シリアル化するのにObjectOutputStreamとObjectInputStreamをうまく使用しました。サーバーとクライアントは通常2つの異なるマシンに搭載されていますが、それはターンベースのカードゲームなので、ユーザーがローカルでプレイして、クライアントとサーバーの両方を同じマシン上で実行します。ObjectOutputStreamを使用せずにシリアライズ可能なオブジェクトをコピー

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

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

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

+0

同じマシンで再生している場合、同じJVMまたは別のJVMで実行されますか? –

+0

コピーコンストラクタを追加するだけでなく、コピー可能にするのはなぜですか? –

+1

また、なぜオブジェクトをメモリ内でシリアル化してから逆シリアル化して、オブジェクトの入出力ストリームを使用してオブジェクトのコピーを作成し直すことができないのか、もう一度教えてください。 –

答えて

4

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); 

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

私はそれが助けてくれることを願っています!

0

通常sendToServer(オブジェクト)関数は、単にObjectOutputStreamの通過オブジェクト を送信しますが、オブジェクトが同じ マシン上にあることから、私はちょうど、各 時間をオブジェクトのキューを作成し、pushとpopができ送信または受信と呼ばれます...

しかし、それはあなたが記述したすべての問題につながります。だから、なぜ何か?それはそのままです。

関連する問題