1

サーバークライアントアプリケーションを作成しています。私のアプリケーションには、チャット部分とゲーム部分の 2 つの部分があります。チャットをするときは String オブジェクトを送信し、ゲームをプレイするときは Game オブジェクトを他のコンピュータに送信します。ObjectInputStream に 2 種類のオブジェクトの違いを認識させるにはどうすればよいでしょうか。私はそのようなことを試みてきました:

if (input.readObject().getClass().isAssignableFrom(Game.class)){
                 game1 = (Game) input.readObject();
                  output.writeObject(game1);
                  output.flush();
             }else{
                 message = (String) input.readObject();
                 output.writeObject(message);
                 output.flush();
             }

ゲームオブジェクトを使用したいときに NotSerializableException をスローしますが、チャットパートは機能しています。

4

1 に答える 1

2

あなたのGameオブジェクトは実装していますSerializableか?ObjectInputStream/を使用して読み書きできるようにする場合は、そうする必要がありますObjectOutputStream

さらに、シリアライズ可能にすることに加えて、同じことがクラスGameで宣言されたすべてのフィールドに適用されます。Gameそれぞれが(または) メンバーSerializableとして実装または宣言されている必要があります。これらの条件が満たされない場合、オブジェクトを書き込もうとすると が返されます。transientstaticNotSerializableException

編集:

コードには他にもいくつかの問題があります。一つには、あなたはreadObject()何度も電話をかけすぎています。次のようなものを試すことをお勧めします。

Object next = input.readObject();
if (next instanceof Game) {
    game1 = (Game)next;
    //...
}
else if (next instanceof String) {
    message = (String)next;
    //...
}
else {
    System.out.println("Unexpected object type:  " + next.getClass().getName());
}
于 2012-10-07T02:02:02.597 に答える