反序列化子类型丢失

使用 fastjson 进行序列化

public class RealTimeMetricData extends RealTimeMetricDataIndex {

    private int version;

    @Nullable
    private Object data;
}
public class RealTimeMetricDataIndex {
    
    private RealTimeBaseMetric metric;

    private String pk;

    private String binName;
}

objectMapper 配置

objectMapper.addMixIn(RealTimeBaseMetric.class, RealTimeBaseMetricMixin.class);
//        this.objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL)
//                .disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
//                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
//                .activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT);
        this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

序列化

objectMapper.writeValueAsString(RealTimeMetricData);

反序列化

objectMapper.readValue(key, new TypeReference<List<RealTimeMetricData>>() {});

问题:此时反序列化得到的 RealTimeBaseMetric 类型丢失

解决:

方法一:使用注解(需修改RealTimeBaseMetric类)

RealTimeBaseMetric类上添加Jackson注解:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class RealTimeBaseMetric {
    // 原有代码
}

方法二:使用Mix-in(无需修改源代码)

创建Mix-in类:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class RealTimeBaseMetricMixin {}

配置ObjectMapper:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(RealTimeBaseMetric.class, RealTimeBaseMetricMixin.class);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值