Frage

Ein paar Monate zurück serialisiert ich ein java.io.Serializable Objekt in eine Datei. Jetzt muss ich den Inhalt lesen, aber seitdem hat sich die serialVersionUID geändert, und jetzt eine „Klasse unvereinbar“ Fehler Ich erhalte. Ich weiß für eine Tatsache, dass keines der Datenelemente geändert hat, so dass die einzige Barriere die serialVersionUID Prüfung ist.

Gibt es eine Möglichkeit den Scheck entweder zu deaktivieren oder die serialVersionUID in der binären Datei zu ändern?

KLARSTELLUNG

Diese Frage wird unter der Annahme, dass ich nicht die Quelle bearbeiten. Gibt es eine Möglichkeit ich die .class-Datei hacken oder vielleicht die serialisierte Objektdatei Hack (einen Hex-Editor verwenden und einen Wert zu einem bestimmten bestimmten ändern Offset)?

War es hilfreich?

Lösung

Als Hack, können Sie die serialver generieren Ihre Jvm wahrscheinlich wird mit dem serialver Tool:

serialver -classpath was auch immer com.foo.bar.MyClass

Wenn Sie dann manuell an die serialVerUID in Ihrer Klasse sollte es passen, und Sie sollten in der Lage sein, zu laden, vorausgesetzt, Sie sind nicht die Klasse so verändert haben, wie ungültig zu machen.

Andere Tipps

Warum nicht die serialVersionUID in der aktuellen Version ändern, anstatt wie in der Serialisierung Dokumentation?

Ich fand mich vor kurzem in einer ähnlichen Situation - ich einige serialisierte Objekte hatte, die ich hatte zu lesen, die serialVersionUID dieser Objekte waren anders als die neueste Version und in meinem Fall gab es ein paar verschiedenen serialVersionUIDs gespeichert in die Datei für die gleiche Klasse (zu verschiedenen Zeiten gespeichert, natürlich). So habe ich den Luxus nicht die Klasse der Modifizierung und Einstellung seiner serialVersionUID; Ich hatte tatsächlich in zu gehen und die gespeicherten Daten zu ändern.

Was ich herausgefunden (durch die java.io Quellcode zu lesen) ist, dass ein Objekt zuerst serialisiert wird durch die Klassennamen zu speichern (mit writeUTF()) und dann sofort nach der Verwendung von writeLong() die serialVersionUID zu speichern.

zurückgehen, suchen Sie nach dem Klassennamen

Meine Lösung war die Ausnahme dann zu fangen, und unmittelbar nach dem Klassennamen ersetzt die alte serialVersionUID mit dem neuen.

Es ist dokumentiert, dass Serialisierung nicht für persistierenden Daten verwendet werden soll. Um zurück, dass die Daten zu erhalten, müssen Sie Ihre Version der JVM auf die Version degradieren, die Ausgabe, die Daten verwendet wurde.

Für die Zukunft, verwenden Sie keine Serialisierung Daten zwischen den Sitzungen der JVM zu bestehen.

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