Java Gson,can';t序列化/反序列化类类型
我有一门课是这样的:Java Gson,can';t序列化/反序列化类类型,java,gson,Java,Gson,我有一门课是这样的: public class A { @serializedName("type") Class<?> type; ... } new GsonBuilder().registerTypeAdapter(Class.class, new MyTypeAdapter ()).create(). fromJson(value, listType); 但我仍然得到同样的错误。 我做错了什么? 适配器的实现看起来正常吗 我做错了什么 Gson将类型信息考
public class A {
@serializedName("type")
Class<?> type;
...
}
new GsonBuilder().registerTypeAdapter(Class.class, new MyTypeAdapter ()).create().
fromJson(value, listType);
但我仍然得到同样的错误。我做错了什么?
适配器的实现看起来正常吗 我做错了什么 Gson将类型信息考虑在内:您试图混合
Class
和Class
这两种类型,它们分别表示原始类型和通配符参数化类型。
从这个角度看,Gson没有考虑<代码>类< /代码>(在您的代码> RealStyType适配器< /C>)和<代码>类< /代码>(在您的DTOS中找到)等价。
对于这种情况,您必须使用registerTypeHierarchyAdapter
注册类型层次结构适配器
适配器的实现看起来正常吗
是的,但是可以稍微改进一下:
final类ClassTypeAdapter
扩展TypeAdapter>instance=new ClassTypeAdapter()
//这是一个方便的方法,可以在write(…)/read(…)本身中执行简单的空检查
.nullSafe();
私有类类型适配器(){
}
静态类型适配器读取(中的最终JsonReader)
抛出IOException{
试一试{
//由于上面使用了nullSafe(),因此该值永远不会为null
最后一个字符串className=in.nextString();
返回Class.forName(className);
}捕获(最终类NotFoundException ex){
//无需复制在ClassNotFoundException中生成的消息
抛出新的JsonParseException(ex);
}
}
}
现在,这可能是一个巨大的安全问题,因为Class.forName
可能会执行代码(静态初始值设定项)。
在执行Class.forName(…)
之前,应该对照类白名单检查className
。
还请注意,
Class
实例不支持类型参数化(请参见TypeToken
s和parameteredType
s的用途),您可能希望使用其所有类型参数化对类型进行编码(易于toString(…)
但解析起来并不那么容易-我曾经遇到过这样的问题,并通过在JParsec中实现解析器解决了它)。是JsonClassTypeAdapter
还是MyTypeAdapter
?@M.Prokhorov,已修复。错误似乎与您正在做的事情无关fromJson
应该产生反序列化错误,而不是序列化错误。另外,奇怪的是,它显示了字符串而不是类的错误(字符串有内置的typeadapter)。你能提供一个MCVE来复制这个问题吗?请注意,在反序列化程序中执行Class.forName()
是一个潜在的巨大安全漏洞:你基本上是在给JSON文件权限,以便在应用程序中执行一些任意的代码。
new GsonBuilder().registerTypeAdapter(Class.class, new MyTypeAdapter ()).create().
fromJson(value, listType);