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.Serialisieren einer SparseArray<T> mit GSON

InformationsquelleAutor Lennart | 2013-06-21
Schreibe einen Kommentar