序列化/反序列化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
相关产品推荐
相关产品推荐

