sql >> Databasteknik >  >> NoSQL >> Redis

Redis serialisering och deserialisering

vad orsakar deserialiseringsproblem?

Jag skulle vilja ge dig lite bakgrund innan jag svarar på din fråga,

Serialiseringskörtiden associerar med varje serialiserbar klass ett versionsnummer, kallat en serialVersionUID, som används under deserialisering för att verifiera att avsändaren och mottagaren av ett serialiserat objekt har laddat klasser för det objektet som är kompatibla med avseende på serialisering. Om mottagaren har laddat en klass för objektet som har ett annat serialVersionUID än motsvarande avsändarklass, kommer deserialisering att resultera i ett InvalidClassException.

Om en serialiserbar klass inte uttryckligen deklarerar ett serialVersionUID, kommer serialiseringskörningstiden att beräkna ett standardvärde för serialVersionUID för den klassen baserat på olika aspekter av klassen. Den använder följande information om klassen för att beräkna SerialVersionUID,

  1. Klassnamnet.
  2. Klassmodifierarna skrivna som ett 32-bitars heltal.
  3. Namnet på varje gränssnitt sorterat efter namn.
  4. För varje fält i klassen sorterat efter fältnamn (förutom privata statiska och privata övergående fält:
  5. Fältets namn.
  6. Fältets modifierare skrivna som ett 32-bitars heltal.
  7. Fältets beskrivning.
  8. om en klassinitierare finns, skriv följande:

    Namnet på metoden, .

    Metodens modifierare, java.lang.reflect.Modifier.STATIC, skriven som ett 32-bitars heltal.

    Metodens beskrivning, ()V.

  9. För varje icke-privat konstruktör sorterad efter metodnamn och signatur:

    Namnet på metoden, .

    Metodens modifierare skrivna som ett 32-bitars heltal.

    Metodens beskrivning.

  10. För varje icke-privat metod sorterad efter metodnamn och signatur:

    Namnet på metoden.

    Metodens modifierare skrivna som ett 32-bitars heltal.

    Metodens beskrivning.

Så för att svara på din fråga,

Skulle ett borttagande av en offentlig/privat egendom orsaka problem? Lägga till nya fastigheter kanske? Skulle ett tillägg av en ny funktion till klassen skapa problem? Vad sägs om fler konstruktörer?

Ja, alla dessa tillägg/borttagningar kommer som standard att orsaka problemet.

Men ett sätt att övervinna detta är att uttryckligen definiera SerialVersionUID, detta kommer att berätta för serialiseringssystemet att jag vet att klassen kommer att utvecklas (eller utvecklas) över tiden och inte kasta ett fel. Så avserialiseringssystemet läser endast de fält som finns på båda sidan och tilldelar värdet. Nyligen tillagda fält på avserialiseringssidan kommer att få standardvärdena. Om några fält raderas på avserialiseringssidan läser algoritmen bara och hoppar över.

Följande är hur man kan deklarera SerialVersionUID,

private static final long serialVersionUID = 3487495895819393L;



  1. Tuning Java Garbage Collection för HBase

  2. Redis försöker ansluta till localhost på Heroku istället för REDIS_URL

  3. Hur kan jag ansluta till MongoDB Atlas med Robomongo?

  4. Hur kan jag dela MongoDB-samlingar mellan Meteor-appar?