这个错误是由于RedisTemplate使用了默认的序列化器,而默认的序列化器要求序列化的对象必须实现Serializable接口,但是您的Inventory对象没有实现Serializable接口,因此导致序列化失败。
解决这个问题有几种方法:
实现Serializable接口: 最简单的方法是让Inventory类实现Serializable接口。这样做可以让Inventory对象序列化,以便存储到Redis中。
import java.io.Serializable;
public class Inventory implements Serializable {
// 序列化版本号,可以不手动设置,由IDE自动生成即可
private static final long serialVersionUID = 1L;
// 其他属性和方法
}
自定义序列化器: 如果Inventory类无法或不方便实现Serializable接口,您可以自定义RedisTemplate的序列化器,使用其他方式来序列化和反序列化Inventory对象。您可以实现自己的序列化器,例如JSON序列化器或者其他第三方库提供的序列化器。
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JsonRedisSerializer<T> implements RedisSerializer<T> {
private final ObjectMapper objectMapper = new ObjectMapper();
@Override
public byte[] serialize(T t) throws SerializationException {
try {
return objectMapper.writeValueAsBytes(t);
} catch (IOException e) {
throw new SerializationException("Error serializing object", e);
}
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null) {
return null;
}
try {
return objectMapper.readValue(bytes, new TypeReference<T>() {});
} catch (IOException e) {
throw new SerializationException("Error deserializing object", e);
}
}
}
然后在RedisTemplate中设置自定义的序列化器:
redisTemplate.setValueSerializer(new JsonRedisSerializer<>());
-
注意:这里的JsonRedisSerializer需要引入Jackson库(com.fasterxml.jackson.core:jackson-databind),并且需要注意在序列化和反序列化过程中的异常处理。
无论采用哪种方法,都可以解决序列化失败的问题,让您的Inventory对象能够正确地存储到Redis中。