Setzen Sie den Standardwert für Felder, die sich nicht in XML befinden, in XStream

8

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.

    
eipark 17.04.2013, 13:02
quelle

3 Antworten

7

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 .

    
René Link 20.04.2015 12:19
quelle
1

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.

    
pablosaraiva 18.04.2013 14:11
quelle
1

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.

    
Shashank Agarwal 18.06.2014 14:33
quelle

Tags und Links