【发布时间】:2017-01-04 16:22:23
【问题描述】:
【问题讨论】:
标签: java json libgdx gson deserialization
【问题讨论】:
标签: java json libgdx gson deserialization
解决方案 1:
转换为标准 Java 数组。由于 Array 实际上只是标准 Java 数组的包装器,因此我们不会丢失转换它的数据,而且 Gson 可以轻松地为我们处理标准数组的序列化和反序列化。
Array<Human> array = new Array<Human>();
array.add(new Human("Jack"));
array.add(new Human("Tom"));
array.add(new Human("Mel"));
array.add(new Human("Anne"));
Gdx.app.log("JSON", "To json");
for (Human human : array) {
Gdx.app.log("Human", human.name);
}
Gson gson = new Gson();
String json = gson.toJson(array.toArray(), Human[].class);
Array<Human> arrayFromJson = new Array<Human>(gson.fromJson(json, Human[].class));
Gdx.app.log("JSON", "From json");
for (Human human : arrayFromJson) {
Gdx.app.log("Human", human.name);
}
输出:
JSON: To json
Human: Jack
Human: Tom
Human: Mel
Human: Anne
JSON: From json
Human: Jack
Human: Tom
Human: Mel
Human: Anne
解决方案 2:
如果您在某种对象中有Array<Human>,则需要手动从 Java 数组转换为 LibGDX 数组,这会有点混乱。
编写自己的序列化程序是解决这个问题的方法,但是用泛型编写序列化程序很复杂,但可能。
最难的部分是反序列化器:
public class ArrayDeserializer<T> implements JsonDeserializer<Array<T>> {
Class<T[]> tClass;
public ArrayDeserializer(Class<T[]> tClass) {
this.tClass = tClass;
}
@Override
public Array<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
T[] objects = context.deserialize(json, tClass);
return new Array<T>(objects);
}
}
序列化器很笨。
public class ArraySerializer implements JsonSerializer<Array> {
@Override
public JsonElement serialize(Array src, Type typeOfSrc, JsonSerializationContext context) {
return context.serialize(src.toArray(), src.toArray().getClass());
}
}
然后在代码中使用:
Type type = TypeToken.get(array.getClass()).getType(); //Array<Human>
...
gsonBuilder.registerTypeAdapter(type, new ArrayDeserializer<Human>(Human[].class));
gsonBuilder.registerTypeAdapter(type, new ArraySerializer());
然后构建能够序列化 libGDX 数组的新 Gson 实例。
【讨论】: