2

サーバー (Java)/クライアント (Android) アプリケーションがあり、サーバー側では、要求に応じて、ObjectOutputStream を介して 3 種類のオブジェクトを送信します。

オブジェクトの種類は次のとおりです。

Java サーバー側では:

//My serializable classA
MySerializableClassA classA = MySerializableClassA(A, B, C);
out.WriteObject(classA);

//Arraylist of my serializable classB
ArrayList<MySerializableClassB> classB = new ArrayList<MySerializableClassB>();
classB.add(new MySerializableClassB(E, F, G, H));
out.writeObject(classB);

//Arraylist of my serializable classC
ArrayList<MySerializableClassC> classC = new ArrayList<MySerializableClassC>();
classC.add(new MySerializableClassC(Y, X, Z));
out.writeObject(classC);

Android クライアント側では次のようになります。

Object obj
private MySerializableClassA classA;
private ArrayList<MySerializableClassB> arrayClassB;
private ArrayList<MySerializableClassC> arrayClassC;

//Here i get the object received, i store it in a Object
in = new ObjectInputStream(_socket.getInputStream());
obj = in.readObject();

//And I check of which class is an instance
if(obj instanceof MySerializableClassA){
    classA = (MySerializableClassA)obj;
    //Do a specific action
}

Object から ArrayList へのキャストがチェックされていないため、問題はここから始まります。

//I check if object is instanceof ArrayList...
else if(obj instanceof ArrayList){
    //and here a need to identify the type of the object inside the arraylist , so... 
    if(the object inside is an instanceof MySerializableClassB){
        arrayClassB = (ArrayList<MySerializableClassB>)obj;
        //Do a specific action
    }
    else if(the object inside is an instanceof MySerializableClassC){ 
        arrayClassC = (ArrayList<MySerializableClassC>)obj;
        //Do a specific action
    }
}

私の質問は次のとおりです。どのタイプの costum 配列リストにオブジェクトが含まれているかを特定する方法はありますか? または、この場合、どのタイプのオブジェクトに私の配列リストが含まれているかを特定するには?

また、classB と classC を 1 つのクラスにマージするオプションもありますが、上記で尋ねたことを実行できれば、より良いでしょう。

私がやりたいことを行うための他の方法の助けや提案は大歓迎です、ありがとう。

4

1 に答える 1

0

あなたが直面している問題はtype eraseと呼ばれます。List<A>実行時に、 と区別する方法はありませんList<B>。次のようなメソッドでリストをオブジェクトにラップすることで回避できます

Class<T> getItemType();

または、2 つの異なる ArrayList サブクラスを作成してからgetActualTypeArguments(). その 2 番目のオプションは非常に奇妙です。

ユースケースで許可されている場合、最も簡単なのは、リストを反復処理して各項目を決定することです。チェックが各アイテムに対して同じ結果をもたらすことは重要ではありません。

リストを項目タイプを持つオブジェクトにラップすると、ストリームにいくつかのメタデータが追加されます。そのラッパーを作成したくない場合は、各リストの前にタイプを手動でストリームに書き込み、カスタム プロトコルを定義することができます。その道を進む場合は、protobufなどを検討してください。

于 2013-03-17T18:29:01.110 に答える