Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Redis Serialisierung und Deserialisierung

Was verursacht Deserialisierungsprobleme?

Bevor ich Ihre Frage beantworte, möchte ich Ihnen einige Hintergrundinformationen geben,

Die Serialisierungslaufzeit ordnet jeder serialisierbaren Klasse eine Versionsnummer namens serialVersionUID zu, die während der Deserialisierung verwendet wird, um zu überprüfen, ob der Sender und der Empfänger eines serialisierten Objekts Klassen für dieses Objekt geladen haben, die in Bezug auf die Serialisierung kompatibel sind. Wenn der Empfänger eine Klasse für das Objekt geladen hat, die eine andere serialVersionUID als die Klasse des entsprechenden Senders hat, führt die Deserialisierung zu einer InvalidClassException.

Wenn eine serialisierbare Klasse nicht explizit eine serialVersionUID deklariert, dann berechnet die Serialisierungslaufzeit einen Standard-serialVersionUID-Wert für diese Klasse basierend auf verschiedenen Aspekten der Klasse. Sie verwendet die folgenden Informationen der Klasse, um SerialVersionUID zu berechnen,

  1. Der Klassenname.
  2. Die Klassenmodifikatoren, geschrieben als 32-Bit-Integer.
  3. Der Name jeder Schnittstelle sortiert nach Namen.
  4. Für jedes Feld der Klasse sortiert nach Feldnamen (außer private statische und private transiente Felder:
  5. Der Name des Feldes.
  6. Die Modifikatoren des Feldes, geschrieben als 32-Bit-Ganzzahl.
  7. Der Deskriptor des Feldes.
  8. wenn ein Klasseninitialisierer existiert, schreiben Sie Folgendes:

    Der Name der Methode, .

    Der Modifikator der Methode, java.lang.reflect.Modifier.STATIC, geschrieben als 32-Bit-Ganzzahl.

    Der Deskriptor der Methode, ()V.

  9. Für jeden nicht privaten Konstruktor, sortiert nach Methodenname und Signatur:

    Der Name der Methode, .

    Die Modifikatoren der Methode, geschrieben als 32-Bit-Integer.

    Der Deskriptor der Methode.

  10. Für jede nicht private Methode sortiert nach Methodenname und Signatur:

    Der Name der Methode.

    Die Modifikatoren der Methode, geschrieben als 32-Bit-Integer.

    Der Deskriptor der Methode.

Also, um Ihre Frage zu beantworten,

Würde die Entfernung eines öffentlichen/privaten Eigentums ein Problem verursachen? Vielleicht neue Eigenschaften hinzufügen? Würde das Hinzufügen einer neuen Funktion zur Klasse Probleme verursachen? Wie wäre es mit mehr Konstruktoren?

Ja, all diese standardmäßigen Hinzufügungen/Entfernungen verursachen das Problem.

Aber eine Möglichkeit, dies zu überwinden, besteht darin, die SerialVersionUID explizit zu definieren. Dadurch wird dem Serialisierungssystem mitgeteilt, dass ich weiß, dass sich die Klasse im Laufe der Zeit weiterentwickeln (oder entwickeln) wird und keinen Fehler auslöst. Das Deserialisierungssystem liest also nur die Felder, die in beiden Seiten vorhanden sind, und weist den Wert zu. Neu hinzugefügte Felder auf der Seite der Deserialisierung erhalten die Standardwerte. Wenn einige Felder auf der Seite der Deserialisierung gelöscht werden, liest der Algorithmus einfach und überspringt.

Im Folgenden ist die Art und Weise, wie man die SerialVersionUID deklarieren kann,

private static final long serialVersionUID = 3487495895819393L;