1

親クラス (クラス P など) と 3 つの子クラス (C1、C2、C3 など) があります。type子クラスのタイプを決定するために、クラス P に変数があります。C1、C2、C3 の複数のインスタンスを含む P のベクトルがあり、Gson ライブラリを使用してそのベクトル オブジェクトを JSON に変換します。Vector<P> として型を指定する Gson を使用して JSON からベクトルを再構築すると (そのために TypeToken を使用します)、クラス P のベクトルを取得しますが、type変数に応じて P オブジェクトを子クラスのいずれかにキャストすると、I ClassCastException を取得します。どうすれば例外なくこれを達成できますか??

Type t = new TypeToken<Vector<P>>() {}.getType();
Vector ps=(Vector<P>)gson.fromJson(jsonString,t);
for(P pObj : ps ) {
    if(pObj.type == 1) {
        C1 cObj=(C1)pObj;
    }
    else if(pObj.type == 2) {
        C2 cObj=(C2)pObj;
    }
    else if(pObj.type == 3) {
        C3 cObj=(C3)pObj;
    }
}
4

1 に答える 1

1

逆シリアル化すると、P のベクトルが得られるため、具体的なクラスは P であるため、基本クラスにキャストできません (および のすべてのオブジェクトの C[1-3] ではありませんVector。取得する唯一のチャンスだと思います。望ましい結果は、独自のデシリアライザーを作成することです。

同じ概念を持つ非常に詳細な回答を書きました。a のList代わりにVector(より柔軟に) を使用し、文字列を使用して基本クラスに一致させます。残りはまさにあなたが進めるべき方法です。

于 2013-10-30T06:26:19.057 に答える