redis缓存对象踩坑:序列化
·
一、Redis存储的数据内容
{ "@class": "com.xxx.xxx", "age": 1, "name": "xxxxx"}
Redis缓存中存储的xxxx对象包含了@class属性,这是Jackson序列化Java对象时的类型信息。以下是原因分析和解决方案:
问题原因
Jackson序列化机制:当使用Jackson将Java对象序列化为JSON字符串存储到Redis时,默认会包含@class字段来记录对象的实际类型,以便反序列化时能够正确还原对象类型。
Redisson配置:Redisson在存储对象时使用了Jackson的序列化机制,会自动添加类型信息以确保反序列化的准确性。
二、解决方案
方案一:配置ObjectMapper不包含类型信息
// 在RedissonClientTemplate或相关配置类中添加
@Resource
private ObjectMapper objectMapper;
// 配置ObjectMapper不自动包含类型信息
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
方案二:使用String序列化方式存储
// 修改存储方式,手动控制序列化
String jsonValue = objectMapper.writeValueAsString(xxxx);
batch.getBucket(RedisKeyConstants.xxxxx+ xxx.getName())
.setAsync(jsonValue);
方案三:在实体类上添加注解控制序列化
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
public class xxxx {
// ... existing code
}
推荐做法
建议采用方案一或方案三,这样既保持了类型安全,又避免了JSON中出现不必要的@class字段。如果需要保持向后兼容性,可以考虑在读取时忽略该字段:
// 在添加注解
@JsonTypeInfo(use = JsonTypeInfo.Id.NONE)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class xxxx {
// ... existing code
}
更多推荐


所有评论(0)