私はカスタムJavaオブジェクトをシリアル化したいので、SharedPreferences
を使用してそれを保存し、別のアクティビティで取得することができます。私は永続的なストレージを必要としません、SharedPreferences
、私は私のアプリケーションが閉じられるときにそれらを拭く。私は現在GSONを使っていますが、AndroidのSparseArrayタイプではうまく動作していないようです。SparseArrayをシリアライズ<T> with GSON
マイオブジェクト:
public class PartProfile {
private int gameId;
// Some more primitives
private SparseArray<Part> installedParts = new SparseArray<Part>();
// ...
}
public class Part {
private String partName;
// More primitives
}
シリアライズ:
Type genericType = new TypeToken<PartProfile>() {}.getType();
String serializedProfile = Helpers.serializeWithJSON(installedParts, genericType);
preferences.edit().putString("Parts", serializedProfile).commit();
serializeWithJSON():
public static String serializeWithJSON(Object o, Type genericType) {
Gson gson = new Gson();
return gson.toJson(o, genericType);
}
デシリアライズ:
Type genericType = new TypeToken<PartProfile>() {}.getType();
PartProfile parts = gson.fromJson(preferences.getString("Parts", "PARTS_ERROR"), genericType);
SparseArray<Part> retreivedParts = parts.getInstalledParts();
int key;
for (int i = 0; i < retreivedParts.size(); i++) {
key = retreivedParts.keyAt(i);
// Exception here:
Part part = retreivedParts.get(key);
// ...
}
例外:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part
私はGsonは私のオブジェクトにLinkedTreeMap
をキャストしたい理由は、私は私のプログラム全体で1を使用することはありません理解していません。 SparseArray<Part>
に切り替える前に私はHashMap<Integer,Part>
を持っていましたが、それに問題はありませんでした。 SparseArraysはGsonでサポートされていないのですか、または私の側にエラーがありますか?
編集:SparseArrayは正しくデシリアライズされているようですが、内部のオブジェクトは正しく表示されないようです。 LinkedTreeMaps
の代わりに、これらはPart
である必要があります。
'SharedPreferences'は、(アプリケーションが強制終了されても)セッション全体で持続します。 [共有設定を使う](http://developer.android.com/guide/topics/data/data-storage。)を読んでください。html#pref) – Rajesh
ええ、私はclear()で手動でそれらを拭きます。私はちょうどそれらを維持することは必要ではないことを指摘したいと思った。 – Lennart
'SharedPreferences'はアクティビティ間でデータを共有するためのものではありません。詳細はhttp://stackoverflow.com/q/3549596/1321873をご覧ください。 – Rajesh