Verwenden von readClassDescriptor () und möglicherweise resolveClass (), um die Versionierung der Serialisierung zu ermöglichen
Ich untersuche verschiedene Optionen im Java-Serialisierungsmechanismus, um Flexibilität in unseren Klassenstrukturen für versionstoleranten Speicher zu ermöglichen (und befürworte einen anderen Mechanismus, den Sie mir nicht mitteilen müssen).
Beispielsweise kann der Standard-Serialisierungsmechanismus sowohl das Hinzufügen als auch das Entfernen von Feldern verarbeiten, wenn nur Abwärtskompatibilität erforderlich ist.
Das Umbenennen oder Verschieben einer Klasse in ein anderes Paket hat sich jedoch als sehr viel schwieriger erwiesen. Ich fand indiese Frage dass ich in der Lage war, ein einfaches Paket umzubenennen und / oder zu verschieben, indem ich ObjectInputStream unterklassifizierte und readClassDescriptor () überschrieb:
if (resultClassDescriptor.getName().equals("package.OldClass"))
resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);
Das ist gut für einfache Umbenennungen. Wenn Sie dann versuchen, ein Feld hinzuzufügen oder zu löschen, erhalten Sie eine java.io.StreamCorruptedException. Schlimmer noch, dies passiert auch, wenn ein Feld hinzugefügt oder gelöscht wurde, unddann Sie benennen die Klasse um, was zu Problemen mit mehreren Entwicklern oder mehreren Eincheckvorgängen führen kann.
Aufgrund meiner Lektüre habe ich ein wenig mit dem Überschreiben von resolveClass () experimentiert, mit der Idee, dass wir den Namen korrekt in die neue Klasse umbenennen, aber nicht die alte Klasse selbst laden und das Feld bombardieren. Dies beruht jedoch auf einem sehr vagen Verständnis einiger Details des Serialisierungsmechanismus, und ich bin mir nicht sicher, ob ich überhaupt den richtigen Baum anklopfe.
Also 2 genaue Fragen:
Warum schlägt die erneute Eingabe des Klassennamens mit readClassDescriptor () bei normalen, kompatiblen Klassenänderungen fehl?Gibt es eine Möglichkeit, dieses Problem mithilfe von resolveClass () oder einem anderen Mechanismus zu umgehen und zuzulassen, dass Klassen sich weiterentwickeln (Felder hinzufügen und entfernen) und umbenannt / neu gepackt werden?Ich stöberte herum und konnte keine entsprechende Frage zu SO finden. Zeigen Sie mir auf jeden Fall auf eine solche Frage, falls vorhanden, aber lesen Sie die Frage sorgfältig genug durch, damit Sie mich nicht schließen, es sei denn, eine andere Frage beantwortet tatsächlich meine genaue Frage.