Java Redis 存储对象去除 @type 字段
在 Java 中将对象存入 Redis 时,Redis 会自动将对象序列化为字符串进行存储。当从 Redis 中取出对象时,Redis 会将字符串反序列化为对象。在反序列化过程中,Redis 会自动添加一个'@type'字段,用于标识对象的类型。
如果你希望从 Redis 中取出的对象不带有'@type'字段,可以使用自定义的序列化和反序列化方式。以下是一种方法:
- 自定义序列化器:
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
public class CustomRedisSerializer<T> implements RedisSerializer<T> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public byte[] serialize(T t) throws SerializationException {
try {
return objectMapper.writeValueAsBytes(t);
} catch (Exception e) {
throw new SerializationException("Failed to serialize object", e);
}
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null) {
return null;
}
try {
return objectMapper.readValue(bytes, 0, bytes.length, Object.class);
} catch (Exception e) {
throw new SerializationException("Failed to deserialize object", e);
}
}
}
- 使用自定义的序列化器存入 Redis:
import org.springframework.data.redis.core.RedisTemplate;
public class RedisExample {
private RedisTemplate<String, Object> redisTemplate;
public void setObject(String key, Object value) {
redisTemplate.setValueSerializer(new CustomRedisSerializer<>());
redisTemplate.opsForValue().set(key, value);
}
public Object getObject(String key) {
redisTemplate.setValueSerializer(new CustomRedisSerializer<>());
return redisTemplate.opsForValue().get(key);
}
}
这样存入 Redis 的对象在取出时就不会带有'@type'字段了。请注意,以上示例是使用 Spring Data Redis 框架的示例,你也可以根据自己的需求来选择合适的 Redis 客户端和序列化器。
原文地址: https://www.cveoy.top/t/topic/pe66 著作权归作者所有。请勿转载和采集!