反序列化子类型丢失

使用 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);
相关推荐
三品吉他手会点灯4 小时前
C语言学习笔记 - 50.流程控制4 - 流程控制为什么非常非常重要
c语言·开发语言·笔记·学习
huangdong_5 小时前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天5 小时前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录9175 小时前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录9176 小时前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥6 小时前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
在放️6 小时前
Python 爬虫 · 第三方代理接入与合规使用
开发语言·爬虫·python
不能只会打代码6 小时前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|6 小时前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy6 小时前
java知识五(继承)
java·开发语言