Ich arbeite in einer Anwendung, in der Objekte im XML-Format gespeichert und später geladen werden müssen, wenn dies erforderlich ist. Dafür habe ich JAXB verwendet, um XMLs zurück zu Java-Klassen zu mapshaltieren und wieder zu entpacken.
Mein Problem ist, dass ich irgendwann einmal Java-Modelle ändern muss (durch das Hinzufügen, Umbenennen oder Löschen von Attributen). Dadurch habe ich inkompatible gespeicherte XMLs, die nicht an das neue Klassenformular gebunden werden können.
Um dies zu lösen, nehme ich bei jeder Änderung eine Kopie aller Klassen unter einem neuen Paket (benannt nach seiner Version) und übernehme die gewünschten Änderungen. Und wenn ich ein XML speichere, speichere ich seine Version, damit ich entscheiden kann, welches Paket von JAXB gescannt werden soll, um dieses XML zu entpacken.
Meine Frage ist, gibt es eine andere Möglichkeit, Rückwärtskompatibilität mit JAXB zu implementieren? Wenn nicht, gibt es andere Technologien, die dies unterstützen können?
Hinweis: Ich bin Mitglied des JAXB 2 ( JSR-222 < a>) Expertengruppe und führen EclipseLink JAXB (MOXy) .
Für diesen Anwendungsfall bevorzuge ich, wenn möglich, ein einzelnes Modell zu verwenden. Dies erfordert, dass Sie mehrere Zuordnungen für Ihr Objektmodell haben. Die JAXB-Spezifikation bietet keine Möglichkeit, dies zu tun, aber es kann mit MOXy externen Metadatenerweiterung durchgeführt werden:
Die Metadaten können verwendet werden, um die Anmerkungen zu ergänzen oder sie zu ersetzen. Daher würde ich empfehlen, Ihr Basisschema mit Anmerkungen zu verknüpfen und das XML-Format zu verwenden, um die Metadaten pro Version des Schemas zu ändern.
Mein Problem ist, dass ich es muss ändere irgendwann Java - Modelle Hinzufügen, Umbenennen oder Löschen Attribute), als Ergebnis werde ich haben Inkompatible gespeicherte XML-Dateien, die nicht erstellt werden können zurück an das neue Klassenformular gebunden.
Das Löschen eines Java-Attributs (field / property) erschwert die Sache, da für das alte XML nichts zu finden ist. Stattdessen können Sie sie in Ihrem Modell belassen und sie in den XML-Metadatendateien als "@XmlTransient" markieren.
Wenn Sie nur neue Attribute hinzufügen, kann es immer noch funktionieren: Es heißt "Ente tippen". Ihr Objekt ist frei, es ignoriert zusätzliche Dinge, die es nicht tut.
Sie müssen sich nur um die Versionierung kümmern, wenn Sie erforderliche Attribute ändern oder entfernen. Leider ist dies bei Datenbankschemas, Java-Serialisierung und jeder anderen Persistenztechnologie der Fall. XML ist keine Magie; es ist nicht immun.
Tags und Links java jaxb compatibility backwards-compatibility