Java-Seralisierung und Deseralisierung

8

Ich habe ein Objekt wie folgt:

%Vor%

Ich habe viele Daten gesammelt, Objekte wie in der obigen Klasse konstruiert und sie auf die Festplatte gebracht.

Ein Speicherauszug, den ich in der Klassendatei vergessen habe, sind Methoden, um auf die Werte für jedes Objekt zuzugreifen. Zum Beispiel, um auf den cId-Wert für ein bestimmtes Objekt zuzugreifen.

Ich habe die Klassendefinition geändert, um solche Methoden hinzuzufügen, aber dann konnte ich die Objekte nicht wieder in die Records-Klasse deseralisieren und bekomme diesen Laufzeitfehler:

%Vor%

Ich denke, ich muss Java sagen, dass sie die gleichen Definitionen sind und die serialVersionUID modifizieren, aber nicht ganz sicher, wie? Jede Idee wäre willkommen!

    
DotNet 24.01.2013, 15:01
quelle

4 Antworten

9

Fügen Sie Ihrer Klasse Folgendes hinzu:

%Vor%

Das bringt die serialVersionUID der Klasse in Übereinstimmung mit dem vom Compiler erzeugten Wert, der verwendet wurde, als die Instanz serialisiert wurde.

Das folgende Zitat aus der Dokumentation ist lesenswert (Schwerpunkt meins):

  

Die Serialisierung Runtime ordnet jedem serializable Klasse eine Versionsnummer, eine so genannte serialVersionUID, die während der Deserialisierung verwendet wird, um zu überprüfen, dass der Sender und Empfänger eines serialisierten Objekts haben für diesen Objektklassen geladen, die in Bezug auf die Serialisierung kompatibel sind. Wenn der Empfänger eine Klasse für das Objekt geladen hat, das eine andere serialVersionUID als die der entsprechenden Klasse des Absenders hat, führt die Deserialisierung zu einer InvalidClassException. Eine serializable Klasse kann seine eigene serialVersionUID erklärt ausdrücklich durch ein Feld deklarieren „serialVersionUID“ genannt, die statisch sein muss, endgültig und vom Typ long:

%Vor%      

Wenn eine serializable Klasse nicht explizit eine serialVersionUID erklären, dann wird die Serialisierung Laufzeit einen Standard serialVersionUID Wert für diese Klasse auf der Grundlage verschiedenen Aspekte der Klasse berechnen, wie in der Java (TM) Objektserialisierung Spezifikation beschrieben. Es wird jedoch dringend empfohlen, dass alle serializable Klassen explizit serialVersionUID Werte deklarieren, da die Standard serialVersionUID Berechnung Klasse Details hochempfindlich ist, die je nach Compiler-Implementierungen variieren können, und in unerwarteten InvalidClassExceptions während der Deserialisierung somit zur Folge haben können. Daher einen konsistenten serialVersionUID Wert über verschiedene Java-Compiler-Implementierungen zu gewährleisten, muss eine serialisierbare Klasse einen expliziten serialVersionUID Wert. Es wird auch dringend empfohlen, dass explizite serialVersionUID Erklärungen den privaten Modifikator verwenden, wo möglich, da solche Erklärungen gelten nur für Die sofort deklarierenden Klasse - serialVersionUID Felder sind nicht als geerbte Mitglieder nützlich. Array-Klassen können keine explizite serialVersionUID deklarieren, daher haben sie immer den berechneten Standardwert, aber die Anforderung für übereinstimmende serialVersionUID-Werte wird für Array-Klassen aufgehoben.

    
NPE 24.01.2013, 15:02
quelle
0

Ja, es ist sehr wichtig, dass Sie serialversionId für die Klasse angeben. Andernfalls wird es schwierig sein, eine serialisierte Klasse zu identifizieren.

Sie können auch ein neues serialisiertes Objekt erstellen, anstatt das alte serialisierte Objekt zu verwenden, wenn Sie dies tun.

Eclipse IDE wird automatisch serialversionId erzeugen und versuchen, diese zu verwenden.

    
Brijesh 24.01.2013 15:05
quelle
0

Das Problem besteht darin, dass Sie Daten serialisiert haben, ohne dass in Ihrer Klasse eine serialVersionUID definiert ist. Hinzufügen von Setter und Getter ist in Ordnung und hat keinen Einfluss auf die Serialisierung, aber der Compiler generiert möglicherweise eine andere UID, wenn Sie die Klasse neu kompilieren, was zu einer Ausnahme führen wird, wenn Sie versuchen, Ihre Daten zu deserialisieren. Wenn Sie die Daten serialisieren müssen, die Sie mit der ersten Version Ihrer Klasse serialisiert haben, müssen Sie wissen, welche UID vom Compiler beim ersten Mal erzeugt wurde: Dies kann in der Fehlermeldung gesehen werden, daher müssen Sie serialVersionUID auf -1232612718276774474L setzen .

    
Bogdan 24.01.2013 15:10
quelle
0

Sie können die ID der seriellen Version in Ihrer Klasse wie folgt deklarieren:

%Vor%     
Jerry B 24.01.2013 15:03
quelle