Jackson XML-Deserialisierung von java.awt.Color aus den Attributen „r“, „g“, „b“, „a“?
Posted: 11 Jan 2025, 09:11
Ich habe ein Legacy-System mit dem folgenden (vereinfachten) Ansatz
und die XML-Darstellung davon ist
Das mit einem ColorSerializer serialisieren;
Beachten Sie den Trick, den Feldnamen „Farbe“ in „r“ umzubenennen und dann nacheinander drei zusätzliche Attribute zu erstellen.
Aber Ich kann NICHT herausfinden, wie ich das zurück in eine java.awt.Color-Instanz deserialisieren kann. Ich erhalte eine Ausnahme, die besagt, dass das Attribut „" ist unbekannt. Es scheint, dass das XML den Prozess steuert, während ich denke, dass ich den Parser dazu bringen müsste, sich den Java-Code anzusehen und diese Laufwerkssuche im analysierten XML durchführen zu lassen.
Irgendwelche Ideen, wie man das anstellen kann?
Code: Select all
public class Gadget {
@JacksonXmlProperty
private Color color;
:
:
}
Code: Select all
Code: Select all
public class ColorSerializer extends StdSerializer {
public ColorSerializer() {
super(Color.class);
}
@Override
public void serialize(Color color, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (!(gen instanceof ToXmlGenerator)) {
throw new UnsupportedOperationException("ColorSerializer can only be used with XML serialization");
}
ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
xmlGen.setNextName(new QName(null, "r"));
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumber(color.getRed());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("g", color.getGreen());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("b", color.getBlue());
xmlGen.setNextIsAttribute(true);
xmlGen.writeNumberField("a", color.getAlpha());
}
}
Aber Ich kann NICHT herausfinden, wie ich das zurück in eine java.awt.Color-Instanz deserialisieren kann. Ich erhalte eine Ausnahme, die besagt, dass das Attribut „
Code: Select all
r
Irgendwelche Ideen, wie man das anstellen kann?