„Okay, dann. Wie Sie wahrscheinlich schon vermutet haben, war das nicht alles.“

„Jetzt erzähle ich Ihnen einige andere Aspekte von JAXB. Aber wie bei JSON beginnen wir mit Sammlungen.“

„Beim Deserialisieren von Sammlungen mit JAXB besteht auch Unsicherheit darüber, welche bestimmte Sammlung (ArrayList, LinkedList, Vector usw.) für die List-Variable verwendet werden soll. Und auch hier wird die Antwort auf diese Frage durch Annotationen bereitgestellt.“

„Es ist alles ziemlich einfach. Wenn der Sammlungstyp nicht in seiner Annotation angegeben ist, versucht JAXB, anhand seines Typs die am besten geeignete Sammlung auszuwählen. Für eine Liste ist dies ArrayList; für eine Karte ist es HashMap usw ."

„In Wirklichkeit gibt es hier weitaus weniger Probleme als bei JSON, da jede Klasse ein eindeutiges Tag hat und man das Tag verwenden kann, um die genaue Klasse anzugeben.“

„Wenn Sie beispielsweise eine Gruppe von Elementen deserialisieren müssen, die einen gemeinsamen Vorfahren erben, verwenden Sie die  Annotation @XmlAny: “

Konvertieren Sie ein Objekt aus XML
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
Eine Klasse, deren Objekte aus XML deserialisiert werden
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> Animals; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; öffentliches  Int-Alter; öffentliches  Int-Gewicht; 
 
 

 Katze() 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; öffentliches  Int-Alter; öffentliches  Int-Gewicht; 
 
 

 Katze() 
 { 
 } 

„Wenn eine Sammlung mit der Annotation @XmlAny markiert ist , können alle geeigneten Objekte darin abgelegt werden. Und der JAXB- Unmarshaller achtet beim Befüllen der Sammlung auf die Tags.“

„In diesem Fall wird die Tag-Sequenz „ <zoo> <cat/><cat/> <dog/> <cat/> </zoo> „ in eine Sammlung mit Cat-, Cat-, Dog- und Cat-Objekten umgewandelt ."

„Das ist ungefähr das, was ich erwartet habe.“

„Uh-huh. Übrigens, noch etwas. Wenn Sie eine Mischung aus Text und Tags deserialisieren, müssen Sie die Annotation @XmlMixed verwenden .“

„Hier ist ein Beispiel für diesen XML-Typ:“

Beispiel-XML, das die Annotation @XmlMixed erfordert
<data> 
<items> 
test 1 <item/> text 2 <item> name </item> text 3 </items> </data> 

 

 

 

„Wow. Ich hatte vergessen, dass es ein solches XML gibt. Ich habe mich daran gewöhnt, dass alles hübsch ist, mit eingebetteten Tags und allem anderen.“

„Es existiert. Und JAXB hat sogar für diesen Fall eine Anmerkung!“

„Großartig. Ich wollte übrigens fragen: Wie werden Aufzählungen serialisiert?“

„Gute Frage! Netter Fang! Irgendwie habe ich dieses Thema übersprungen.“

„Es gibt eine spezielle @XmlEnum-Annotation, die zum Markieren von Aufzählungen verwendet werden muss. Sie können damit angeben, ob die Werte als Zahlen oder Zeichenfolgen gespeichert werden.“

„Es gibt auch eine @XmlEnumValue-Annotation, mit der Sie den Wert angeben können, der einem bestimmten Enum-Feld entspricht.“

"Hier sind einige Beispiele:"

Zahlen Saiten
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

„Holy Moly. Ich kann mir nicht vorstellen, wo ich das brauchen würde, aber ich denke, es ist sehr nützlich. Und am wichtigsten ist, dass ich mich nicht an Standardzeichenfolgen oder numerische Werte halten muss.“

„Ja. Das ist praktisch, wenn Sie beispielsweise ein Programm schreiben, das Nachrichten beispielsweise mit einem Facebook-Server austauscht, und ihnen ein Wertesatz zugewiesen ist. Sie müssen sie nur einer eigenen Enumeration zuweisen und alles wird funktionieren. "

„Das ist wunderbar. Ich mag JAXB auf jeden Fall.“

„Großartig. Dann war’s das für heute. Geh und mach eine Pause.“