Serialisieren einer SparseArray<T> mit GSON
Ich serialisieren möchten Sie eine benutzerdefinierte Java-Objekt, so kann ich mit SharedPreferences
zu speichern, und retreive es in einer anderen Aktivität. Ich brauche keine persistente Speicherung, die SharedPreferences
wische ich Sie, wenn meine Anwendung geschlossen wird. Ich bin derzeit mit GSON für diese, aber es scheint nicht zu funktionieren gut mit Android SparseArray geben.
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 casten will ein LinkedTreeMap
zu meinem Objekt, ich benutze nie einen in meinem gesamten Programm. Früher habe ich ein HashMap<Integer,Part>
bevor ich wechselte zu den SparseArray<Part>
, und hatte nie Probleme damit. Sind SparseArrays nicht unterstützt Gson, oder ist es ein Fehler auf meiner Seite?
Edit: Es scheint, dass die SparseArray wird deserialisiert richtig, aber nicht die Gegenstände im inneren. Statt LinkedTreeMaps
diese sollte vom Typ Part
.
SharedPreferences
bleiben in den Sitzungen (auch wenn die Anwendung nicht getötet). Lesen Sie Verwendung von Shared Preferences- Ja, aber ich wischen Sie Sie manuell mit clear(). Ich wollte nur darauf hinweisen, dass das verharren Sie nicht notwendig ist.
SharedPreferences
sind nicht dazu gedacht für den Austausch von Daten zwischen Aktivitäten. Bitte siehe stackoverflow.com/q/3549596/1321873 für mehr info.- Sehen Sie, wenn die Erhaltung Eingabe von Informationen löst Ihr Problem: pragmateek.com/javajson-mapping-with-gson/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Beobachtung ist korrekt, da SparseArray enthält Objekt (nicht
Part
), Gson keine Ahnung, um Teil als Ihren Objekttyp. Daher ordnen Sie Ihre Liste als seinen berüchtigten internen TypLinkedTreeMap
.Um es zu lösen, ich denke, Sie werden nicht in der Lage zu verwenden
SparseArray
... Oder Sie versuchenretreivedParts.get(key).toString()
, dann benutze gson zu analysieren, das Objekt erneut. Aber ich glaube nicht, dass es effizient zu tun, dassGson gson = new GsonBuilder().enableComplexMapKeySerialization().create()
zu serialisieren, da irgendwie meine custom-Objekte nicht ordnungsgemäß deserialisiert werden, ohne dass die option aktiviert ist.Wirklich, es ist ein Weg zu serialisieren jede Art von
SparseArray
hier ein Beispiel-code:und zu verwenden, müssen Sie es registrieren es in Ihrem
Gson
Objekt, so wie hier:finden Sie dieses Beispiel in diese gist.
P. S.: ich weiß, es ist nicht optimiert, aber es ist nur ein Beispiel, um eine Vorstellung zu geben, wie Sie zu erreichen, was Sie brauchen.