Как десериализовать объект, хранящийся в Redis, если имя класса хранимого объекта изменяется? - PullRequest
0 голосов
/ 19 февраля 2019

Я сохранил объект в 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 голосов
/ 20 февраля 2019
"{\"@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}"

Так что просто проверьте значение в вашем случае, еслиВы можете обновить имя класса в его значении

0 голосов
/ 01 марта 2019

Я использовал GenericJackson2JsonRedisSerializer для сериализации объекта и сохранял в redis.Чтобы изменить имя класса, я использовал StringRedisSerializer для десериализации, изменил имя класса и снова сохранил его в Redis с помощью StringRedisSerializer.

Затем использовал, как обычно, GenericJackson2JsonRedisSerializer для десериализации объекта с новым именем класса.Это сработало.

0 голосов
/ 19 февраля 2019

Нет необходимости использовать Serializeable.Вы можете сериализовать его в формат, который не выполняет проверку классов.Примером такого формата может быть простой байтовый массив, это может быть json, это может быть более продвинутая среда сериализации, как Kryo.Вы можете использовать protobuff, вот пример: https://codeclimate.com/blog/choose-protocol-buffers/

В общем, я думаю, что JSON - самый простой формат.Хороший баланс между производительностью, удобочитаемостью и возможностью поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...