'Oké dan. Zoals je waarschijnlijk al geraden hebt, was dat niet alles.'
"Nu zal ik je vertellen over verschillende andere aspecten van JAXB. Maar zoals we deden met JSON, beginnen we met collecties."
"Bij het deserialiseren van collecties met JAXB, is er ook onzekerheid over welke specifieke collectie (ArrayList, LinkedList, Vector, etc.) moet worden gebruikt voor de List-variabele. En opnieuw wordt het antwoord op deze vraag geleverd door annotaties."
"Het is allemaal vrij eenvoudig. Als het verzamelingstype niet is gespecificeerd in de annotatie, zal JAXB proberen de meest geschikte verzameling te selecteren met behulp van het type. Voor een lijst is dit ArrayList; voor een kaart is het HashMap, enz. ."
"In werkelijkheid zijn er hier veel minder problemen dan bij JSON, omdat elke klasse een unieke tag heeft en je de tag kunt gebruiken om de exacte klasse te specificeren."
"Als u bijvoorbeeld een groep elementen moet deserialiseren die een gemeenschappelijke voorouder erven, gebruikt u de @XmlAny: annotatie"
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);
}
@XmlType(name = "zoo") @XmlRootElement class Zoo { @XmlAny public List<Object> dieren; } @XmlType(name = "cat") @XmlRootElement class Cat { public String-naam; openbare int leeftijd; openbaar int gewicht; Kat() { } } @XmlType(name = "dog") @XmlRootElement class Dog { openbare tekenreeksnaam; openbare int leeftijd; openbaar int gewicht; Kat() { } }
"Als een collectie is gemarkeerd met de @XmlAny- annotatie, kunnen alle geschikte objecten erin worden geplaatst. En de JAXB Unmarshaller let op de tags bij het vullen van de collectie."
"In dit geval wordt de reeks tags " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " omgezet in een verzameling met Cat-, Cat-, Dog- en Cat-objecten ."
"Dat is ongeveer wat ik had verwacht."
"Uh-huh. Trouwens, nog één ding. Als je een combinatie van tekst en tags deserialiseert, moet je de @XmlMixed- annotatie gebruiken."
"Hier is een voorbeeld van dit type XML:"
<data> <items> test 1 <item/> tekst 2 <item> naam </item> tekst 3 </items> </data>
"Wauw. Ik was vergeten dat zulke XML bestaat. Ik raakte eraan gewend dat alles mooi was, met ingesloten tags en al het andere."
"Het bestaat. En JAXB heeft zelfs voor dit geval een annotatie!"
"Geweldig. Trouwens, ik wilde vragen: hoe worden opsommingen geserialiseerd?"
"Goede vraag! Leuke vangst! Op de een of andere manier heb ik dat onderwerp overgeslagen."
"Er is een speciale @XmlEnum-annotatie die moet worden gebruikt om opsommingen te markeren. U kunt deze gebruiken om aan te geven of de waarden worden opgeslagen als getallen of strings."
"Er is ook een @XmlEnumValue-annotatie waarmee u de waarde kunt specificeren die overeenkomt met een bepaald enum-veld."
"Hier zijn enkele voorbeelden:"
Nummers | Snaren |
---|---|
|
|
"Holy moly. Ik kan me niet voorstellen waar ik dit nodig zou hebben, maar ik denk dat het erg handig is. En het allerbelangrijkste: ik hoef me niet te houden aan standaard string- of numerieke waarden."
"Ja. Dit is bijvoorbeeld handig als je een programma schrijft dat berichten uitwisselt met bijvoorbeeld een Facebook-server, en ze hebben een toegewezen set waarden. Je hoeft ze alleen maar aan hun eigen opsomming toe te wijzen en alles zal werken. "
"Dat is geweldig. Ik hou absoluut van JAXB."
"Geweldig. Dan was dat het voor vandaag. Ga even pauzeren."
GO TO FULL VERSION