在 Java 中将对象存入 Redis 时,Redis 会自动将对象序列化为字符串进行存储。当从 Redis 中取出对象时,Redis 会将字符串反序列化为对象。在反序列化过程中,Redis 会自动添加一个'@type'字段,用于标识对象的类型。

如果你希望从 Redis 中取出的对象不带有'@type'字段,可以使用自定义的序列化和反序列化方式。以下是一种方法:

  1. 自定义序列化器:
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);
        }
    }
}
  1. 使用自定义的序列化器存入 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 客户端和序列化器。

Java Redis 存储对象去除 @type 字段

原文地址: https://www.cveoy.top/t/topic/pe66 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录