如果存储对象的类名更改,如何反序列化存储在Redis中的对象?

时间:2019-02-19 11:25:30

标签: java redis

我已经在Redis中存储了一个对象,例如Class StorageConnection,

public void storeSecureConnection(String uniqueKey, Object storageConnection) {
        redisTemplateAdmin.opsForValue().set(uniqueKey, storageConnection);

}

现在,我将className从StorageConnection更改为DataConnection。 所有字段和UID均保持不变。

现在在

上给了我SerializationException
public 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();
}

3 个答案:

答案 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对具有新类名的对象进行反序列化。奏效了。