为什么gson不允许java.lang.Class的序列化?
如果您尝试序列化具有java.lang.Class
类型字段的对象,则序列化将导致java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: Forgot to register a type adapter
以下是com.google.gson.internal.bind.TypeAdapters.java中的代码段
public final class TypeAdapters { . . . public static final TypeAdapter CLASS = new TypeAdapter() { @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解答不解析Class变量 –
在第340期的评论中 ,Gson项目经理解释说:
序列化类型实际上是一个安全问题,所以我们不希望默认支持它。 恶意.json文件可能会导致您的应用程序加载其他情况下不会加载的类; 根据您的类路径加载某些类可能会使您的应用程序。
但是在你自己的应用程序中编写一个类型适配器以支持它是非常简单的。
当然,因为序列化不一样
反序列化,我不明白这是对残疾序列化的解释,除非未提及的概念在某种意义上“平衡”序列化与反序列化的默认行为。