【问题标题】:Why has gson does not allow serialization of java.lang.Class?为什么 gson 不允许 java.lang.Class 的序列化?
【发布时间】:2015-12-01 17:47:59
【问题描述】:

如果您尝试序列化具有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 的代码 sn-p

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)

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

【问题讨论】:

  • 好的,谢谢。似乎这个问题是在问同样的问题。我想我的问题中的描述消除了一些困惑。我将使用那里的答案自己回答这个问题。

标签: java serialization gson


【解决方案1】:

@Programmer Bruce Gson not parsing Class variable 回答 -

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

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

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

当然,因为序列化不一样

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 2022-06-26
    相关资源
    最近更新 更多