Gson无法序列化/反序列化Class类型问题求助
嘿,这个问题我熟!你碰到的是Gson默认不支持序列化Class类型的典型问题,报错提示已经说得很明确了——得给Class类型注册一个自定义的TypeAdapter才行。
完整的MyTypeAdapter实现
你已经写了适配器的开头,我给你补全完整的可用版本,它会把Class对象序列化为全类名字符串,反序列化时再通过类名加载对应的Class实例:
public class MyTypeAdapter extends TypeAdapter<Class<?>> { @Override public Class<?> read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } String className = in.nextString(); try { // 用默认类加载器加载目标类,若有自定义类加载需求可自行替换 return Class.forName(className); } catch (ClassNotFoundException e) { // 把类找不到的异常包装成IO异常,符合Gson的异常处理逻辑 throw new IOException("Failed to load class with name: " + className, e); } } @Override public void write(JsonWriter out, Class<?> value) throws IOException { if (value == null) { out.nullValue(); return; } // 将Class对象转为全类名字符串写入JSON out.value(value.getName()); } }
注册适配器的两种方式
写好适配器后,得把它和Gson关联起来才能生效,这里有两种常用方式:
方式1:全局注册(所有Class类型字段通用)
通过GsonBuilder创建Gson实例时注册适配器,这样项目中所有Class类型的字段都会用这个适配器处理:
Gson gson = new GsonBuilder() .registerTypeAdapter(Class.class, new MyTypeAdapter()) .create();
方式2:局部注册(仅作用于指定字段)
如果你只想让类A里的type字段使用这个适配器,可以直接在字段上添加@JsonAdapter注解,更灵活:
public class A { @SerializedName("type") @JsonAdapter(MyTypeAdapter.class) Class<?> type; // 其他字段、构造方法和业务逻辑 }
为什么会触发这个错误?
Gson的默认序列化逻辑只能处理基本类型、普通POJO、标准集合这类“常规”对象,像Class这种属于Java反射体系的特殊类型,没有内置的序列化/反序列化规则,所以Gson会抛出这个错误,提示你需要手动提供转换逻辑。
内容的提问来源于stack exchange,提问作者CCC
相关产品推荐
相关产品推荐

