使用 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);