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

时间:2015-12-01 17:48:00

标签: java serialization gson

如果您尝试序列化具有java.lang.Class类型字段的对象,则序列化它将导致java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: <some_class> Forgot to register a type adapter

以下是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?");
      }
    }
.
.
.
}

这是用gson编码的,只是为了提醒人们“忘记注册类型适配器”吗?

在我看来,Class类型对象可以使用以下语句轻松序列化和反序列化:

序列化:clazz.getName()

反序列化:Class.forName(className)

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

1 个答案:

答案 0 :(得分:2)

由@Programmer Bruce Gson not parsing Class variable -

回答

comment in issue 340中,Gson项目经理解释说:

  

序列化类型实际上是一个安全问题,所以我们   默认情况下不想支持它。恶意的.json文件可以   导致您的应用程序加载其他情况下不会加载的类;   根据您的班级路径加载某些类可以DoS你的   应用

     

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

当然,因为序列化与

不一样

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

相关问题