如何解决Gson和抽象超类:反序列化问题
遵循Axxiss链接,此处遵循答案。必须提供自定义的序列化器/解串器。
public class AClassAdapter implements JsonSerializer<A>, JsonDeserializer<A> {
@Override
public JsonElement serialize(A src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
result.add("properties", context.serialize(src, src.getClass()));
return result;
}
@Override
public A deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsstring();
JsonElement element = jsonObject.get("properties");
try {
String fullName = typeOfT.getTypeName();
String packageText = fullName.substring(0, fullName.lastIndexOf(".") + 1);
return context.deserialize(element, Class.forName(packageText + type));
} catch (ClassNotFoundException cnfe) {
throw new JsonParseException("UnkNown element type: " + type, cnfe);
}
}
}
然后进行序列化,如下所示:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(A.class, new ATypeAdapter());
String json = gson.create().toJson(list);
并给出json字符串,反序列化为:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(A.class, new ATypeAdapter());
return gson.create().fromJson(json, A[].class);
解决方法
假设有一个 抽象 类say A
和两个非抽象子类say
A1
和A2
。我想通过使用GSON库从json格式“反序列化”它们。
例如,我得到一个A
对象数组。
int n = ...;
A[] list = new A[n];
A[0] = new A1(....);
A[1] = new A2(....);
...
有人将其转换为JSON字符串,如下所示:
String json = (new Gson()).toJson(list);
最后,如果我尝试如下反序列化
A[] deserializedList = (new Gson()).fromJson(json,A[].class);
那么我就遇到了一个错误,因为GSON默认的反序列化器找到了一个抽象类(即A
),并且它无法猜测子类的类型。
我该如何解决?
PS:我阅读了有关自定义反序列化器的信息,但在这种情况下我不知道如何使用它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。