反序列化子类型丢失

使用 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);
相关推荐
心之语歌37 分钟前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊2 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang2 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang3 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解3 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing8 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean8 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven979 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55118 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河19 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化