3
votes

Comment désérialiser un objet stocké dans redis, si le nom de classe de l'objet stocké change?

J'ai stocké un objet dans redis, disons Class StorageConnection,

@Service
public class AdminDataBaseServiceImpl{
    private RedisTemplate<String, Object> redisTemplateAdmin;
    private HashOperations hashOps;

    private AdminDataBaseServiceImpl(RedisTemplate<String, Object> redisTemplateAdmin) {
    this.redisTemplateAdmin = redisTemplateAdmin;
    hashOps=redisTemplateAdmin.opsForHash();
}

Maintenant, j'ai changé le className de StorageConnection à DataConnection. Tous les champs et l'UID restent intacts.

Cela me donne maintenant une SerializationException sur

public DataConnection getAdminDataObject(String uniqueKey) {    
        return  (DataConnection) redisTemplateAdmin.opsForValue().get(uniqueKey);
    }

Y a-t-il une astuce pour que je puisse le désérialiser avec le nouveau className?

Edit

Voici l'initialisation de RedisTemplate:

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

}


2 commentaires

Pourriez-vous ajouter le code où redisTemplateAdmin est instancié?


@Arnaud Ajouté ..


3 Réponses :


0
votes

Il n'est pas nécessaire d'utiliser Serializeable. Vous pouvez le sérialiser dans un format qui n'effectue pas de vérification de classe. Un exemple d'un tel format peut être un simple tableau d'octets, cela peut être json, cela peut être un framework de sérialisation plus avancé que Kryo. Vous pouvez utiliser protobuff, voici un exemple: https://codeclimate.com/blog/choose -protocol-buffers /

Dans l'ensemble, je pense que JSON est le format le plus simple à utiliser. Bon équilibre entre performances, lisibilité et facilité de recherche.


5 commentaires

Mais je ne peux pas changer ma conception existante. Je peux changer le processus de désérialisation, mais nous avons beaucoup de données qui sont déjà sérialisées et stockées dans les données. Je ne peux pas me permettre de perdre ces données.


Est-ce si difficile de le migrer? :) Il n'y a pas de contrôle du nom de classe. Au moins pas un que je connaisse immédiatement.


Mais une migration ne devrait pas être si difficile en théorie. Il vous suffit de lire les données dans l'ancien format et de les réinsérer avec le nouveau sérialiseur.


Voici une réponse stackoverflow qui passe en revue exactement ce que je n'ai jamais dit. Vous pouvez le lire depuis une autre classe: stackoverflow.com/questions/2358886/...


J'ai peur mais cela ne peut pas être fait. Tout ce que je peux faire en remplaçant RedisDeserializers?



1
votes
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 commentaires

0
votes

J'ai utilisé GenericJackson2JsonRedisSerializer pour sérialiser l'objet et je le stockais dans redis. Pour changer le nom de la classe, j'ai utilisé StringRedisSerializer pour désérialiser, changé le nom de classe et à nouveau stocké dans Redis avec StringRedisSerializer .

Puis utilisé, comme d'habitude, GenericJackson2JsonRedisSerializer pour désérialiser l'objet avec un nouveau nom de classe. Cela a fonctionné.


0 commentaires