You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:23