【发布时间】:2018-04-10 16:18:18
【问题描述】:
我有这样的课程:
public class A {
@serializedName("type")
Class<?> type;
...
}
但是当我尝试序列化它时,我收到一条错误消息“尝试序列化 java.lang.class:java.lang.String。忘记注册 TypeAdapter?”。所以我创建了这个适配器:
public class MyTypeAdapter extends TypeAdapter<Class> {
public Class read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
} else {
String className = in.nextString();
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
throw new JsonParseException("class " + className + " not found");
}
}
}
public void write(JsonWriter out, Class value) throws IOException {
if (value == null) {
out.nullValue();
} else {
out.value(value.getName());
}
}
}
并像这样注册它:
new GsonBuilder().registerTypeAdapter(Class.class, new MyTypeAdapter ()).create().
fromJson(value, listType);
但我仍然遇到同样的错误。
我做错了什么?
适配器的实现看起来没问题吗?
【问题讨论】:
-
是
JsonClassTypeAdapter还是MyTypeAdapter? -
@M.Prokhorov,已修复。
-
该错误似乎与您正在做的事情无关。
fromJson应该产生反序列化错误,而不是序列化错误。此外,奇怪的是它显示的是 String 而不是 Class 的错误(String 具有内置的类型适配器)。你能提供一个复制问题的 MCVE 吗? -
请注意,在反序列化器中执行
Class.forName()是一个潜在的巨大安全漏洞:您基本上是在授予 JSON 文件权限以在您的应用程序中执行一些任意代码。