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

如果您尝试序列化具有
java.lang.Class类型字段的对象,则序列化将导致java.lang.UnsupportedOperationException:尝试序列化java.lang.Class:< some_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?");
      }
    }
.
.
.
}

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

在我看来,使用以下语句可以很容易地对类型对象进行序列化和反序列化:

序列化:clazz.getName()

反序列化:Class.forName(className)

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

最佳答案 正如@Programmer Bruce
Gson not parsing Class variable所回答 –

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

Serializing types is actually somewhat of a security problem, so we
don’t want to support it by default. A malicious .json file could
cause your application to load classes that it wouldn’t otherwise;
depending on your class path loading certain classes could DoS your
application.

But it’s quite straightforward to write a type adapter to support this
in your own app.

当然,因为序列化不一样

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

点赞