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

序列化/反序列化java.io.Serializable对象缺失类型ID属性报错如何解决

问题原因

你遇到的反序列化失败是因为Jackson无法为DataSourceObject找到合法的构造方法完成实例化:

  • DataSourceObject仅提供了一个带参构造方法,没有无参构造
  • 仅给构造方法加@JsonCreator不足以让Jackson完成参数和JSON属性的映射,Java编译默认不会保留方法参数名,你之前只加@JsonCreator仍然报错,就是因为没有显式绑定构造参数和JSON属性的对应关系,Jackson无法识别构造参数要接收哪个JSON字段的值。

解决方案

方案1:保留类不可变性(推荐)

直接修改DataSourceObject的构造方法,给参数添加@JsonProperty注解绑定JSON属性名,修改后的代码如下:

public static class DataSourceObject<T extends Serializable> implements Serializable {

    private static final long serialVersionUID = -6026669040755678830L;

    private final T concreteObject;

    @JsonCreator
    public DataSourceObject(@JsonProperty("concreteObject") final T concreteObject) {
        this.concreteObject = concreteObject;
    }

    public T getConcreteObject() {
        return concreteObject;
    }
}

这个方案不需要修改原有类的字段定义,保留了concreteObject的final不可变特性,且完全兼容你现有多态序列化配置,不需要提前知道被包装对象的具体类型即可完成反序列化。

方案2:添加无参构造和Setter(可选)

如果你可以接受修改类的不可变性,也可以选择给DataSourceObject添加无参构造和对应的Setter方法,Jackson会通过无参构造实例化后调用Setter注入属性:

public static class DataSourceObject<T extends Serializable> implements Serializable {

    private static final long serialVersionUID = -6026669040755678830L;

    private T concreteObject;

    public DataSourceObject() {
    }

    public DataSourceObject(final T concreteObject) {
        this.concreteObject = concreteObject;
    }

    public T getConcreteObject() {
        return concreteObject;
    }

    public void setConcreteObject(T concreteObject) {
        this.concreteObject = concreteObject;
    }
}

两种方案任选其一即可解决你遇到的反序列化异常。

内容的提问来源于stack exchange,提问作者Nicolas Dos Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:00