Chcę serializować niestandardowy obiekt Java, dzięki czemu mogę użyć go do zapisania go i odzyskania go w innym działaniu. Nie potrzebuję trwałego przechowywania, SharedPreferences
, I wytrzeć je, gdy moja aplikacja jest zamknięta. Obecnie używam GSON, ale wygląda na to, że nie działa dobrze z typem SparseArray systemu Android.Serializing a SparseArray <T> z GSON
Moje obiekty:
public class PartProfile {
private int gameId;
// Some more primitives
private SparseArray<Part> installedParts = new SparseArray<Part>();
// ...
}
public class Part {
private String partName;
// More primitives
}
serializacji:
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);
}
deserializacjia:
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);
// ...
}
Wyjątek:
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part
Nie rozumiem dlaczego Gson chce rzucić LinkedTreeMap
do mojego obiektu, nigdy nie używać jednego w moim całego programu. Kiedyś miałem HashMap<Integer,Part>
zanim przełączyłem się na SparseArray<Part>
i nigdy nie miałem z tym problemów. Czy SparseArrays nie jest obsługiwany przez Gson, czy jest jakiś błąd po mojej stronie?
Edytuj: Wygląda na to, że SparseArray otrzymuje poprawnie deserializację, ale nie obiekty wewnątrz. Zamiast LinkedTreeMaps
, powinny one być typu Part
.
"SharedPreferences" utrzymuje się pomiędzy sesjami (nawet jeśli aplikacja zostanie zabita). Przeczytaj [Korzystanie z preferencji współdzielonych] (http://developer.android.com/guide/topics/data/data-storage.html # pref) – Rajesh
Tak, ale wyczyściłem je ręcznie za pomocą clear(). Chciałem tylko wskazać, że utrzymanie ich nie jest konieczne. – Lennart
'SharedPreferences' nie służy do udostępniania danych między działaniami. Więcej informacji można znaleźć na stronie http://stackoverflow.com/q/3549596/1321873. – Rajesh