sql >> Database >  >> NoSQL >> Redis

Redis-serialisatie en deserialisatie

wat veroorzaakt deserialisatieproblemen?

Ik wil je graag wat achtergrondinformatie geven voordat ik je vraag beantwoord,

De serialisatie-runtime koppelt aan elke serialiseerbare klasse een versienummer, een serialVersionUID genaamd, dat tijdens deserialisatie wordt gebruikt om te verifiëren dat de afzender en ontvanger van een geserialiseerd object klassen voor dat object hebben geladen die compatibel zijn met betrekking tot serialisatie. Als de ontvanger een klasse voor het object heeft geladen die een andere serialVersionUID heeft dan die van de klasse van de corresponderende afzender, zal deserialisatie resulteren in een InvalidClassException.

Als een serialiseerbare klasse niet expliciet een serialVersionUID declareert, berekent de serialisatie-runtime een standaard serialVersionUID-waarde voor die klasse op basis van verschillende aspecten van de klasse. Het gebruikt de volgende informatie van de klasse om SerialVersionUID te berekenen,

  1. De klasnaam.
  2. De class modifiers geschreven als een 32-bits geheel getal.
  3. De naam van elke interface gesorteerd op naam.
  4. Voor elk veld van de klasse gesorteerd op veldnaam (behalve persoonlijke statische en persoonlijke tijdelijke velden:
  5. De naam van het veld.
  6. De modifiers van het veld geschreven als een 32-bits geheel getal.
  7. De descriptor van het veld.
  8. als er een klasse-initiator bestaat, schrijf dan het volgende op:

    De naam van de methode, .

    De modifier van de methode, java.lang.reflect.Modifier.STATIC, geschreven als een 32-bits geheel getal.

    De descriptor van de methode, ()V.

  9. Voor elke niet-private constructor gesorteerd op naam en handtekening van de methode:

    De naam van de methode, .

    De modifiers van de methode geschreven als een 32-bits geheel getal.

    De descriptor van de methode.

  10. Voor elke niet-private methode gesorteerd op methodenaam en handtekening:

    De naam van de methode.

    De modifiers van de methode geschreven als een 32-bits geheel getal.

    De descriptor van de methode.

Dus, om je vraag te beantwoorden,

Zou een verwijdering van een openbaar/privaat eigendom een ​​probleem opleveren? Nieuwe eigenschappen toevoegen, misschien? Zou het toevoegen van een nieuwe functie aan de klasse problemen veroorzaken? Hoe zit het met meer constructeurs?

Ja, al deze toevoegingen/verwijderingen zullen standaard het probleem veroorzaken.

Maar een manier om dit te verhelpen is om de SerialVersionUID expliciet te definiëren, dit zal het serialisatiesysteem vertellen dat ik weet dat de klasse in de loop van de tijd zal evolueren (of geëvolueerd) en geen fout zal veroorzaken. Dus het de-serialisatiesysteem leest alleen die velden die in beide zijden aanwezig zijn en wijst de waarde toe. Nieuw toegevoegde velden aan de deserialisatiezijde krijgen de standaardwaarden. Als sommige velden aan de deserialisatiekant worden verwijderd, leest het algoritme gewoon en slaat het over.

Hieronder volgt de manier waarop men de SerialVersionUID kan declareren,

private static final long serialVersionUID = 3487495895819393L;



  1. flushdb wist niet alle sleutels in redis?

  2. Moongoose totale $ match komt niet overeen met id's

  3. Wat is er nieuw in MongoDB 4.4

  4. Mongoose.js instance.save() callback wordt niet geactiveerd