3

を持っていますArrayList <GeneralTemplate> items

プログラム全体で、GeneralTemplate のサブクラスであるルーチンを追加しています。つまりitems.add(new Routine("Test"));、すべて問題ありません。

最も重要なことは、次のことを実行できることです..Routine myRoutine = items.get(position);

Google の GSON ライブラリを使用して、この大量のアイテム リストを JSON の特別なデータ オブジェクトに保存しています。これが問題かもしれないと思います。

このデータ オブジェクトには、ArrayList <GeneralTemplate> items. Routineプログラム中に、項目リストに格納されたルーチンが実際にオブジェクトであることがわかります。次に、以下のコードを使用して保存します。このプロセスをデバッガーで実行しました。RoutineList を設定すると、Routine オブジェクトは問題なく維持されます。

// Global save String method
public static void save()
{
    Editor editor = sharedPreferences.edit();

    RoutineData tempSaveObject = new RoutineData();
    tempSaveObject.setRoutineList(routineList);

    String routineListInJSON = gson.toJson(tempSaveObject);

    editor.putString(ROUTINE_LIST, routineListInJSON).commit();
}

アプリを再起動してデータを取得すると、問題が発生します。リスト内のすべてのアイテムはオブジェクトに戻り、->を介してGeneralTemplateキャストバックすることはできません(以下のロード用のコード)RoutineRoutine routine = (Routine) items.get(position)ClassCastException

    // Get a global sharedPreferences object that can be used amongst Activities
    sharedPreferences = this.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);

    if (sharedPreferences.contains(ROUTINE_LIST))
    {
        String routineListJSON = sharedPreferences.getString(ROUTINE_LIST, null);
        routineDataObject = gson.fromJson(routineListJSON, RoutineData.class);

        routineList = routineDataObject.getRoutineList();
    }
    else
    {
        routineList = new ArrayList<GeneralTemplate>();     
    }

したがって、サブクラスのコンテキストを取り戻すことができないため、特定のメソッドや変数にアクセスできません。この問題には他にもいくつかの例があるため、これに対する適切な解決策があれば、あなたがよく知っていると大いに役立ちます.

ありがとう!

並べ替え:

Genson JSON ライブラリ。

https://code.google.com/p/genson/downloads/detail?name=genson-0.94.jar&can=2&q=

カスタムシリアライザー/デシリアライザーは必要なく、物事が非常に簡単になりました。デフォルトですべての詳細なポリモーフィズムを処理しました。

Eugenの回答に示されているように実装

4

1 に答える 1