我已经在Redis中存储了一个对象,例如Class StorageConnection,
public void storeSecureConnection(String uniqueKey, Object storageConnection) {
redisTemplateAdmin.opsForValue().set(uniqueKey, storageConnection);
}
现在,我将className从StorageConnection更改为DataConnection。 所有字段和UID均保持不变。
现在在
上给了我SerializationExceptionpublic DataConnection getAdminDataObject(String uniqueKey) {
return (DataConnection) redisTemplateAdmin.opsForValue().get(uniqueKey);
}
有什么技巧可以使用新的className反序列化吗?
修改:
这里是RedisTemplate初始化:
@Service
public class AdminDataBaseServiceImpl{
private RedisTemplate<String, Object> redisTemplateAdmin;
private HashOperations hashOps;
private AdminDataBaseServiceImpl(RedisTemplate<String, Object> redisTemplateAdmin) {
this.redisTemplateAdmin = redisTemplateAdmin;
hashOps=redisTemplateAdmin.opsForHash();
}
答案 0 :(得分:1)
"{\"@class\":\"org.crm.backend.repository.redis.dto.TripInfoDto\",\"tripId\":44271,\"demandUserId\":11811,\"demandUserPhoneNumber\":\"7777777777\",\"supplierId\":1223,\"supplierPhoneNumber\":\"7777777777\",\"criticalOn\":\"DEMAND\",\"loadingBucket\":430119,\"tripType\":\"RETAIL\",\"creationTime\":1548422893462}"
在我的情况下,这是Redis中的键值,要与另一个类反序列化,我可以为该键更新Redis中的值。
hset mapKey 44271 "{\"@class\":\"org.crm.backend.repository.redis.dto.AnotherClass\",\"tripId\":44271,\"demandUserId\":11811,\"demandUserPhoneNumber\":\"9929011689\",\"supplierId\":1223,\"supplierPhoneNumber\":\"9929014797\",\"criticalOn\":\"DEMAND\",\"loadingBucket\":430119,\"tripType\":\"RETAIL\",\"creationTime\":1548422893462}"
所以只要检查您的情况下的值,是否可以使用其值更新类名
答案 1 :(得分:0)
使用Serializeable是不必要的。您可以将其序列化为不进行类检查的格式。这种格式的示例可以是简单的字节数组,也可以是json,也可以是Kryo等更高级的序列化框架。您可以使用protobuff,这是一个示例:https://codeclimate.com/blog/choose-protocol-buffers/
总而言之,我认为JSON是最简单的格式。在性能,可读性和可搜索性之间取得良好的平衡。
答案 2 :(得分:0)
我使用GenericJackson2JsonRedisSerializer
来序列化对象,并存储在Redis中。要更改类名,我使用StringRedisSerializer
进行反序列化,更改了类名,然后再次使用StringRedisSerializer
存储在Redis中。
然后照常使用GenericJackson2JsonRedisSerializer
对具有新类名的对象进行反序列化。奏效了。