gpt4 book ai didi

android - 使用 GSON 序列化 SparseArray

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:24:21 26 4
gpt4 key购买 nike

我想序列化一个自定义 Java 对象,所以我可以使用 SharedPreferences存储它并在另一个 Activity 中检索它。我不需要持久存储,SharedPreferences ,我在关闭应用程序时删除它们。我目前为此使用 GSON,但它似乎不适用于 Android 的 SparseArray 类型。

我的对象:

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);
// ...
}

异常(exception):

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.mypackage.objects.Part

我不明白为什么 Gson 要投一个 LinkedTreeMap对于我的对象,我从不在我的整个程序中使用一个。我曾经有一个 HashMap<Integer,Part>在我切换到 SparseArray<Part> 之前,并且从来没有遇到过问题。 Gson 不支持 SparseArrays,还是我这边有错误?

编辑:似乎 SparseArray 得到了正确的反序列化,但里面的对象却没有。而不是 LinkedTreeMaps , 这些应该是 Part 类型. enter image description here

最佳答案

确实有一种方法可以序列化任何类型的 SparseArray,这里是一个示例代码:

public class SparseArrayTypeAdapter<T> extends TypeAdapter<SparseArray<T>> {

private final Gson gson = new Gson();
private final Class<T> classOfT;
private final Type typeOfSparseArrayOfT = new TypeToken<SparseArray<T>>() {}.getType();
private final Type typeOfSparseArrayOfObject = new TypeToken<SparseArray<Object>>() {}.getType();

public SparseArrayTypeAdapter(Class<T> classOfT) {
this.classOfT = classOfT;
}

@Override
public void write(JsonWriter jsonWriter, SparseArray<T> tSparseArray) throws IOException {
if (tSparseArray == null) {
jsonWriter.nullValue();
return;
}
gson.toJson(gson.toJsonTree(tSparseArray, typeOfSparseArrayOfT), jsonWriter);
}

@Override
public SparseArray<T> read(JsonReader jsonReader) throws IOException {
if (jsonReader.peek() == JsonToken.NULL) {
jsonReader.nextNull();
return null;
}
SparseArray<Object> temp = gson.fromJson(jsonReader, typeOfSparseArrayOfObject);
SparseArray<T> result = new SparseArray<T>(temp.size());
int key;
JsonElement tElement;
for (int i = 0; i < temp.size(); i++) {
key = temp.keyAt(i);
tElement = gson.toJsonTree(temp.get(key));
result.put(key, gson.fromJson(tElement, classOfT));
}
return result;
}

}

要使用它,您需要在 Gson 对象中注册它,如下所示:

Type sparseArrayType = new TypeToken<SparseArray<MyCustomClass>>() {}.getType();
Gson gson = new GsonBuilder()
.registerTypeAdapter(sparseArrayType, new SparseArrayTypeAdapter<MyCustomClass>(MyCustomClass.class))
.create();

您可以在 this gist 中找到此示例.

P.S.:我知道它根本没有优化,但这只是一个例子,可以让您了解如何实现您的需求。

关于android - 使用 GSON 序列化 SparseArray<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17231298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com