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); }
3 Réponses :
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.
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?
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}"
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é.
Pourriez-vous ajouter le code où
redisTemplateAdmin
est instancié?@Arnaud Ajouté ..