Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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
为什么gson不允许java.lang.Class的序列化?_Java_Serialization_Gson - Fatal编程技术网

为什么gson不允许java.lang.Class的序列化?

为什么gson不允许java.lang.Class的序列化?,java,serialization,gson,Java,Serialization,Gson,如果尝试序列化具有类型为java.lang.Class的字段的对象,序列化它将导致java.lang.UnsupportedOperationException:尝试序列化java.lang.Class:忘记注册类型适配器 下面是com.google.gson.internal.bind.TypeAdapters.java中的代码片段 public final class TypeAdapters { . . . public static final TypeAdapter<Clas

如果尝试序列化具有类型为
java.lang.Class
的字段的对象,序列化它将导致
java.lang.UnsupportedOperationException:尝试序列化java.lang.Class:忘记注册类型适配器

下面是com.google.gson.internal.bind.TypeAdapters.java中的代码片段

public final class TypeAdapters {
.
.
.
  public static final TypeAdapter<Class> CLASS = new TypeAdapter<Class>() {
    @Override
    public void write(JsonWriter out, Class value) throws IOException {
      if (value == null) {
        out.nullValue();
      } else {
        throw new UnsupportedOperationException("Attempted to serialize java.lang.Class: "
            + value.getName() + ". Forgot to register a type adapter?");
      }
    }
.
.
.
}
公共最终类类型适配器{
.
.
.
公共静态最终类型适配器类=新类型适配器(){
@凌驾
公共void write(JsonWriter out,类值)抛出IOException{
如果(值==null){
out.nullValue();
}否则{
抛出新的UnsupportedOperationException(“尝试序列化java.lang.Class:”
+value.getName()+“。忘记注册类型适配器了吗?”;
}
}
.
.
.
}
gson中的编码是否只是为了提醒人们“忘记注册类型适配器”

在我看来,
Class
type对象可以使用以下语句轻松地进行序列化和反序列化:

序列化:
clazz.getName()

反序列化:
Class.forName(className)


当前实现背后的原因是什么?我错在哪里?

正如@Programmer Bruce所回答的那样-

在a中,Gson项目经理解释:

序列化类型实际上是一个安全问题,所以我们 默认情况下不希望支持它。恶意的.json文件可能会 使您的应用程序加载否则不会加载的类; 根据您的类路径,加载某些类可能会使您的 应用程序

但是编写一个类型适配器来支持这一点非常简单 在你自己的应用程序中

当然,因为序列化与

反序列化,我不明白这是如何解释 禁用序列化,除非未提及的概念在某种意义上是
“平衡”序列化与反序列化的默认行为。

可能重复的是,谢谢。问题似乎是在问同一个问题。我想我问题中的描述消除了一些混淆。我将使用那里的答案自己回答这个问题。