Ich möchte ein benutzerdefiniertes Java-Objekt serialisieren, so dass ich SharedPreferences
verwenden kann, um es zu speichern und es in einer anderen Aktivität zu retreive. Ich brauche keinen dauerhaften Speicher, die SharedPreferences
, lösche ich sie, wenn meine Anwendung geschlossen ist. Ich verwende derzeit GSON, aber es scheint nicht gut mit Android SparseArray Typ zu arbeiten.Serialisieren eines SparseArray <T> mit GSON
Meine Objekte:
public class PartProfile {
private int gameId;
// Some more primitives
private SparseArray<Part> installedParts = new SparseArray<Part>();
// ...
}
public class Part {
private String partName;
// More primitives
}
Serialisierung:
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);
}
Deserialisierung:
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);
// ...
}
Ausnahme:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part
Ich verstehe nicht, warum Gson ein LinkedTreeMap
auf mein Objekt werfen will, und ich habe nie in meinem ganzen Programm verwenden. Ich hatte eine HashMap<Integer,Part>
, bevor ich auf die SparseArray<Part>
wechselte, und hatte nie Probleme damit. Werden SparseArrays von Gson nicht unterstützt, oder liegt ein Fehler auf meiner Seite vor?
Bearbeiten: Es scheint, dass das SparseArray korrekt deserialisiert wird, aber nicht die Objekte darin. Anstelle von LinkedTreeMaps
sollten diese vom Typ Part
sein.
'SharedPreferences' bleiben für Sitzungen bestehen (selbst wenn die Anwendung beendet wird). Lesen Sie [Gemeinsame Einstellungen verwenden] (http://developer.android.com/guide/topics/data/data-storage).html # pref) – Rajesh
Ja, aber ich wische sie manuell mit clear(). Ich wollte nur darauf hinweisen, dass es nicht notwendig ist, sie zu halten. – Lennart
'SharedPreferences' sind nicht für die gemeinsame Nutzung von Daten gedacht. Weitere Informationen finden Sie unter http://stackoverflow.com/q/3549596/1321873. – Rajesh