Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gson,can';t序列化/反序列化类类型_Java_Gson - Fatal编程技术网

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);