Frage

Wenn Klasse Serializable in Eclipse implementiert, habe ich zwei Möglichkeiten: add default serialVersionUID(1L) oder erzeugt serialVersionUID(3567653491060394677L). Ich denke, dass erste ist kühle, aber oft ich sah, wie Menschen die zweite Option. Gibt es einen Grund long serialVersionUID zu generieren?

War es hilfreich?

Lösung

Soweit ich sagen kann, das wäre nur für die Kompatibilität mit früheren Versionen. Dies wäre nur dann sinnvoll, wenn Sie vor einer serialVersionUID verwenden vernachlässigt, und machte dann eine Änderung, die Sie wissen sollten, kompatibel aber die Serialisierung zu brechen verursacht.

Sehen Sie die Java Serialisierung Spec weitere Details.

Andere Tipps

Der Zweck der UID-Serialisierung Version, den Überblick über verschiedene Versionen einer Klasse zu halten, um gültige Serialisierung von Objekten auszuführen.

Die Idee ist, eine ID zu erzeugen, die auf eine bestimmte Version eine Klasse einzigartig ist, die dann geändert wird, wenn es neue Details zu der Klasse, wie zum Beispiel ein neues Feld hinzugefügt werden, die die Struktur des serialisierten Objekts beeinflussen würde .

Immer die gleiche ID verwenden, wie 1L bedeutet, dass in der Zukunft, wenn die Klassendefinition geändert wird, die Änderungen an die Struktur des serialisierten Objekts verursacht, wird es eine gute Chance, dass Probleme bei dem Versuch, ein Objekt zu deserialisieren.

Wenn die ID nicht angegeben, Java wird die ID für Sie tatsächlich berechnet basierend auf den Feldern des Objekts, aber ich glaube, es ist ein teurer Prozess, so bietet man wird manuell die Leistung verbessern.

Hier sind ein paar Links zu Artikeln, die Serialisierung und Versionierung von Klassen diskutieren:

Der Hauptgrund für das erzeugte einen wäre es mit einer vorhandenen Version der Klasse kompatibel zu machen, die bereits Kopien andauert.

Der "long" default des serialVersionUID ist der Standardwert, wie definiert durch die Java Serialisierung Spezifikation , aus dem Standard Serialisierungsverhalten berechnet.

Wenn Sie also die Standardversionsnummer hinzufügen, wird Ihre Klasse (De-) serialisiert schneller solange nichts strukturell verändert hat, aber Sie werden darauf achten müssen, dass, wenn Sie die Klasse zu ändern (hinzufügen / entfernen Felder) Sie aktualisiert auch die Seriennummer.

Wenn Sie müssen nicht auf bestehende Bitströmen kompatibel sein, können Sie einfach 1L dort setzen und die Version erhöht je nach Bedarf, wenn sich etwas ändert. Das heißt, wenn die Standard-Serialisierung Version der geändertenen Klasse würde von der Standard-Version der alten Klasse unterschiedlich sein.

absolut sollten Sie erstellen eine serialVersionUID jedes Mal, wenn Sie definieren eine Klasse, die java.io.Serializable implementiert. Wenn Sie das nicht tun, wird ein werden automatisch erstellt, aber das ist schlecht. Die automatisch generierten serialVersionUID basiert auf den Methodensignaturen der Klasse, so wenn Sie Ihre Klasse in der Zukunft ändern, um ein Verfahren (zum Beispiel) hinzuzufügen, Deserialisieren die „alten“ Versionen der Klasse fehlschlagen. Hier ist was passieren kann:

  1. Erstellen Sie die erste Version der Klasse, ohne zu definieren, die serialVersionUID.
  2. serialisiert eine Instanz der Klasse zu einem persistenten Speicher; ein serialVersionUID wird automatisch für Sie generiert.
  3. Ändern Sie Ihre Klasse eine neue Methode hinzuzufügen, und Ihre Anwendung erneut bereitstellen.
  4. Versuchen Sie, die Instanz zu deserialisieren, die in Schritt 2 serialisiert wurde, aber jetzt schlägt es (wenn es gelingen sollte), weil es eine hat verschiedene automatisch generierte serialVersionUID.

Wenn Sie keine serialVersionUID angeben dann macht Java eine on the fly. Der erzeugte serialVersionUID ist diese Zahl. Wenn Sie etwas in Ihrer Klasse ändern, die nicht wirklich Ihre Klasse nicht kompatibel mit früheren serialisierten verisons macht aber ändert den Hash, dann müssen Sie die erzeugte sehr große Nummer serialVersionUID (oder die „erwartete“ Nummer aus der Fehlermeldung) verwenden, . Andernfalls, wenn Sie den Überblick über alles, was halten Sie sich, 0, 1, 2 ... ist besser.

Wenn Sie serialVersionUID (1L), anstatt zu erzeugen serialVersionUID (3567653491060394677L) Sie etwas sagen.

Sie sagen, dass Sie zu 100% sicher sind, dass kein System, das jemals diese Klasse berühren wird, die eine inkompatible serialisierte Version dieser Klasse mit einer Versionsnummer von 1 hat.

Wenn Sie irgendeine Entschuldigung denken können für sie Geschichte serialisierte Version ist unbekannt zu sein, das könnte schwierig sein, mit Zuversicht zu sagen. Darin Lebensdauer ist, wird eine erfolgreiche Klasse von vielen Menschen gehalten werden, leben in vielen Projekten und befinden sich in vielen Systemen.

Sie können über das Kopf zerbrechen. Oder Sie können die Lotterie spielen zu verlieren hoffen. Wenn Sie die Version generieren Sie eine winzige Chance, die Dinge schief gehen. Wenn Sie davon ausgehen, „Hey, ich wette, niemand 1 verwendet noch“ Ihre Chancen sind größer als winzig. Es ist gerade, weil wir alle 0 denken und 1 sind cool, dass Sie höhere Chancen haben, sie zu schlagen.

-

Wenn Sie erzeugen serialVersionUID (3567653491060394677L) statt verwenden serialVersionUID (1 l) Sie sagen etwas.

Sie sagen die Leute können entweder manuell erstellt oder generiert andere Versionsnummern über die Geschichte dieser Klasse und Sie kümmern sich nicht, weil Longs große Zahlen sind freaking.

So oder so, es sei denn Sie perfekt die Geschichte der Versionsnummern verwendet wissen, wann die Klasse im gesamten Universum von Serialisierung, wo es hat oder jemals existieren, werden Sie eine Chance nehmen. Wenn Sie die Zeit, um 100% sicher 1 AOK haben, gehen für sie. Wenn das zu viel Arbeit ist, gehen Sie voran und blind die Zahl erzeugen. Du bist eher im Lotto zu gewinnen, als zu haben, dass nichts falsch machen. Ist dies der Fall, lassen Sie mich wissen und ich werde Dir ein Bier kaufen.

Mit all dem Gerede in der Lotterie zu spielen, habe ich Ihnen den Eindruck, kann die serialVersionUID erzeugt wird zufällig. In der Tat, solange der Zahlenbereich gleichmäßig jeden möglichen Wert über eine Lang vertrieben wird, die in Ordnung sein würde. Allerdings ist es tatsächlich so gemacht:

http://docs.oracle. com / JavaSE / 6 / docs / platform / Serialisierung / spec / class.html # 4100

Der einzige Unterschied, den Sie mit, dass zu bekommen ist, dass Sie keine Quelle von Zufalls benötigen. Sie verwenden die Änderungen in der Klasse selbst das Ergebnis zu ändern. Aber nach dem Schubfachprinzip gibt es noch eine Chance, es schief gehen könnte und eine Kollision hat. Es ist einfach unglaublich unwahrscheinlich. So viel Glück bekommen ein Bier aus mir heraus.

Doch selbst wenn die Klasse wird immer nur in einem System leben und eine Code-Basis, zu denken, dass die Anzahl von Hand Inkrementieren gibt Ihnen keine Chance Kollisionen nur bedeutet, dass Sie nicht verstehen, Menschen. :)

Nun, das ist serialVersionUID eine Ausnahme von der Regel, dass „statische Felder nicht bekommen, serialisiert“. Object schreibt jedes Mal, wenn der Wert von serialVersionUID in den Ausgabestream. Object liest sie zurück, und wenn der Wert aus dem Stream liest nicht mit dem serialVersionUID Wert in der aktuellen Version der Klasse zustimmen, dann wirft er die InvalidClassException. Außerdem, wenn kein serialVersionUID es offiziell in der Klasse deklariert ist serialisiert werden, automatisch Compiler es mit einem Wert erzeugt fügt basierend auf den Feldern in der Klasse deklariert.

Da in vielen Fällen Standard-ID nicht eindeutig ist. so schaffen wir id für einzigartiges Konzept.

Um zu @ David Schmitts Antwort, als Faustregel fügt ich immer den Standard-1L aus Konvention verwenden würde. Ich hatte nur zurück zu gehen und einige von ihnen ein paar Mal zu ändern, aber ich wusste, dass, wenn ich die Änderung vorgenommen hat und aktualisiert die Standardnummer jedes Mal um eins.

Bei meiner jetzigen Firma benötigen sie die automatisch generierte Zahl so verwende ich, dass für Konvention, aber ich ziehe die Standardeinstellung. Meine Meinung ist, wenn es nicht eine Konvention ist, wo Sie arbeiten, verwenden Sie die Standardeinstellung, wenn Sie denken, Sie ständig aus irgendeinem Grund die Struktur der Sie serialisierte Klassen werden zu ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top