Redis
 sql >> Base de données >  >> NoSQL >> Redis

Sérialisation et désérialisation Redis

qu'est-ce qui cause les problèmes de désérialisation ?

Je voudrais vous donner un peu de contexte avant de répondre à votre question,

Le runtime de sérialisation associe à chaque classe sérialisable un numéro de version, appelé serialVersionUID, qui est utilisé lors de la désérialisation pour vérifier que l'expéditeur et le destinataire d'un objet sérialisé ont chargé des classes pour cet objet qui sont compatibles en ce qui concerne la sérialisation. Si le destinataire a chargé une classe pour l'objet qui a un serialVersionUID différent de celui de la classe de l'expéditeur correspondant, la désérialisation entraînera une InvalidClassException.

Si une classe sérialisable ne déclare pas explicitement un serialVersionUID, le runtime de sérialisation calculera une valeur serialVersionUID par défaut pour cette classe en fonction de divers aspects de la classe. Il utilise les informations suivantes de la classe pour calculer SerialVersionUID,

  1. Le nom de la classe.
  2. Les modificateurs de classe écrits sous la forme d'un entier 32 bits.
  3. Le nom de chaque interface trié par nom.
  4. Pour chaque champ de la classe trié par nom de champ (à l'exception des champs privés statiques et privés transitoires :
  5. Le nom du champ.
  6. Les modificateurs du champ écrits sous la forme d'un entier 32 bits.
  7. Le descripteur du champ.
  8. si un initialiseur de classe existe, écrivez ce qui suit :

    Le nom de la méthode, .

    Le modificateur de la méthode, java.lang.reflect.Modifier.STATIC, écrit sous la forme d'un entier 32 bits.

    Le descripteur de la méthode, ()V.

  9. Pour chaque constructeur non privé trié par nom de méthode et signature :

    Le nom de la méthode, .

    Les modificateurs de la méthode écrits sous la forme d'un entier 32 bits.

    Le descripteur de la méthode.

  10. Pour chaque méthode non privée triée par nom de méthode et signature :

    Le nom de la méthode.

    Les modificateurs de la méthode écrits sous la forme d'un entier 32 bits.

    Le descripteur de la méthode.

Donc, pour répondre à votre question,

La suppression d'une propriété publique/privée poserait-elle un problème ? Ajouter de nouvelles propriétés, peut-être? L'ajout d'une nouvelle fonction à la classe créerait-il des problèmes ? Que diriez-vous de plus de constructeurs ?

Oui, tous ces ajouts/suppressions par défaut causeront le problème.

Mais une façon de surmonter cela est de définir explicitement le SerialVersionUID, cela indiquera au système de sérialisation que je sais que la classe évoluera (ou évoluera) au fil du temps et ne génère pas d'erreur. Ainsi, le système de désérialisation lit uniquement les champs qui sont présents à la fois sur le côté et attribue la valeur. Les champs nouvellement ajoutés du côté de la désérialisation obtiendront les valeurs par défaut. Si certains champs sont supprimés du côté de la désérialisation, l'algorithme se contente de lire et d'ignorer.

Voici la façon dont on peut déclarer le SerialVersionUID,

private static final long serialVersionUID = 3487495895819393L;