Gibt es eine Möglichkeit, einen Konverter oder eine Operation zu erstellen, die nach jeder einzelnen Konvertierung ausgeführt wird? Für den Kontext versuche ich, Standardwerte für Felder zu füllen, die nicht in meinem XML enthalten sind, um die Abwärtskompatibilität beizubehalten, wenn sich mein Datenmodell ändert. Zum Beispiel, wenn ich dieses Objekt hätte:
%Vor%und mein XML war etwas wie:
%Vor% Ich möchte, dass mein XML-Import weiß, dass es einen Standardwert für das Feld c
gibt, das "c"
ist, und setze es auf A
als solches. Dies sollte eine generische Operation sein, der ich Standardwerte zu jedem Feld eines sehr komplexen Graphen hinzufügen kann. Wenn es nach jeder Konvertierung eine Möglichkeit gäbe, eine Funktion auszulösen, könnte das aktuelle Objekt mit einer Objektkarte verglichen werden, für die ich einen Standardwert festlegen möchte.
Beachten Sie auch, dass readResolve / readObject- Verwendung scheint nicht eine Option zu sein, da 1. readObject- () nie für mich überhaupt und 2. readResolve zu arbeiten schien das Feld mit dem Standardwert überschreiben würde, selbst wenn es tatsächlich enthalten war im XML. Bitte lassen Sie mich wissen, ob meine Annahmen hier falsch sind.
Bearbeiten :: Ich habe diesen verwandten Thread in der Benutzer-Mailingliste gefunden: Ссылка
und es scheint, als wäre die einzige vorgeschlagene Lösung die Verwendung von readResolve()
, von der ich bereits sagte, dass sie keine gültige Lösung ist.
Mit dem PureJavaReflectionProvider
%Vor%und initialisieren Sie Ihr Objekt wie gewohnt mit den Standardwerten. Entweder durch Feldinitialisierung oder Konstruktorcode.
Hintergrund
Wenn Sie nicht angeben, ein ReflectionProvider
xstream versucht um den besten Reflexionsanbieter zu finden. Aber das beste ReflectionProvider
für xstream ist möglicherweise nicht das Beste für dich, weil es normalerweise Sun14ReflectionProvider
auswählt.
Die Sun14ReflectionProvider
verwendet die gleiche Instanziierungsstrategie wie die Java-Serialisierungs-Mechanismus und das bedeutet, dass es überspringt Konstruktor-Code oder detaillierter - der Objektinitialisierer-Code.
Daher Feldinitialisierungen wie
%Vor%wird nicht angewendet und auch der Konstruktorcode wird nicht angewendet, z. B.
%Vor% Das PureJavaReflectionProvider
verwendet stattdessen (wie der Name impliziert) die Java-Reflektions-API, um Objekte, z. Class.newInstance()
und daher Initialisierungscode Objekt ausgeführt .
Sie benötigen einen Konverter.
Hier ist ein Codebeispiel für Ihren Fall:
%Vor%}
Vergessen Sie nicht, den Konverter zu registrieren:
%Vor%BEARBEITEN: Der Konvertercode wurde korrigiert.
c
wird auf null
gesetzt, wenn für den XML-Code kein Wert für c
festgelegt wurde. Sie können dann in Ihrem Getter nach null
suchen und den entsprechenden Standardwert zurückgeben.