SharedPreferences
을 사용하여 다른 Java 활동에 저장하고 검색 할 수 있도록 사용자 정의 Java 객체를 직렬화하려고합니다. 영구 저장 장치가 필요하지 않습니다. 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);
// ...
}
예외 : GSON 내 개체에 LinkedTreeMap
캐스팅하고 싶은 이유를
java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part
나는 내 전체 프로그램에서 하나를 사용하지 않습니다, 이해가 안 돼요. 이전에 SparseArray<Part>
으로 전환하기 전에 나는 HashMap<Integer,Part>
을 사용 했었지만 문제는 없었습니다. Gear가 SparseArrays를 지원하지 않습니까? 아니면 저의 편에 오류가 있습니까?
편집 : 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