反序列化子类型丢失

使用 fastjson 进行序列化

java 复制代码
public class RealTimeMetricData extends RealTimeMetricDataIndex {

    private int version;

    @Nullable
    private Object data;
}
java 复制代码
public class RealTimeMetricDataIndex {
    
    private RealTimeBaseMetric metric;

    private String pk;

    private String binName;
}

objectMapper 配置

java 复制代码
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);

序列化

java 复制代码
objectMapper.writeValueAsString(RealTimeMetricData);

反序列化

java 复制代码
objectMapper.readValue(key, new TypeReference<List<RealTimeMetricData>>() {});

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

解决:

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

RealTimeBaseMetric类上添加Jackson注解:

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

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

创建Mix-in类:

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

配置ObjectMapper:

java 复制代码
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(RealTimeBaseMetric.class, RealTimeBaseMetricMixin.class);
相关推荐
许彰午1 天前
CacheSQL(三):双 HTTP 引擎与 SQL 查询——接口抽象的价值
java·数据库·sql·缓存
手握风云-1 天前
Spring AI:让大模型住进 Spring 生态(三)
java·后端·spring
咸鱼2.01 天前
【java入门到放弃】Dubbo
java·开发语言·dubbo
JAVA面经实录9171 天前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
周杰伦fans1 天前
AutoCAD .NET 二次开发:深入理解 EntityJig 的工作原理与正确实现
开发语言·.net
许彰午1 天前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U1 天前
JavaEE|多线程初阶(七)
java·开发语言
谭欣辰1 天前
C++ 排列组合完整指南
开发语言·c++·算法
foundbug9991 天前
自适应滤除直达波干扰的MATLAB实现
开发语言·算法·matlab