を持っています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
キャストバックすることはできません(以下のロード用のコード)Routine
Routine 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の回答に示されているように実装