"Okej då. Som du säkert redan har gissat så var det inte allt."
"Nu ska jag berätta om flera andra aspekter av JAXB. Men som vi gjorde med JSON kommer vi att börja med samlingar."
"När man deserialiserar samlingar med JAXB, finns det också osäkerhet om vilken speciell samling (ArrayList, LinkedList, Vector, etc.) som ska användas för Listvariabeln. Och återigen ges svaret på denna fråga av anteckningar."
"Det hela är ganska enkelt. Om samlingstypen inte anges i anteckningen, kommer JAXB att försöka välja den mest lämpliga samlingen med hjälp av dess typ. För en lista kommer detta att vara ArrayList; för en karta kommer det att vara HashMap, etc. ."
"I verkligheten finns det mycket färre problem här än med JSON, eftersom varje klass har en unik tagg, och du kan använda taggen för att specificera den exakta klassen."
"Om du till exempel behöver deserialisera en grupp av element som ärver en gemensam förfader, använder du @XmlAny: -anteckningen"
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(namn = "zoo") @XmlRootElement klass Zoo { @XmlAny public List<Object>-djur; } @XmlType(name = "cat") @XmlRootElement class Cat { public String name; offentlig int ålder; offentlig int vikt; Cat() { } } @XmlType(namn = "hund") @XmlRootElement class Dog { public String name; offentlig int ålder; offentlig int vikt; Cat() { } }
"Om en samling är märkt med @XmlAny- anteckningen kan alla lämpliga objekt läggas i den. Och JAXB Unmarshaller uppmärksammar taggarna när samlingen fylls på."
"I det här fallet kommer sekvensen av taggarna " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " att konverteras till en samling med katt-, katt-, hund- och kattobjekt ."
"Det var ungefär vad jag förväntade mig."
"Uh-huh. Åh, förresten, en sak till. Om du deserialiserar en blandning av text och taggar måste du använda @ XmlMixed -kommentaren."
"Här är ett exempel på den här typen av XML:"
<data> <items> test 1 <item/> text 2 <item> name </item> text 3 </items> </data>
"Wow. Jag hade glömt att sådan XML finns. Jag vande mig vid att allt var snyggt, med inbäddade taggar och allt annat."
"Det finns. Och JAXB har en anteckning även för det här fallet!"
"Jättebra. Förresten, jag ville fråga: hur serialiseras uppräkningar?"
"Bra fråga! Bra fångst! Jag hoppade över det ämnet på något sätt."
"Det finns en speciell @XmlEnum-anteckning som måste användas för att markera uppräkningar. Du kan använda den för att ange om värdena ska lagras som siffror eller strängar."
"Det finns också en @XmlEnumValue-anteckning som låter dig ange värdet som kommer att motsvara ett visst uppräkningsfält."
"Här är några exempel:"
Tal | Strängar |
---|---|
|
|
"Holy moly. Jag kan inte föreställa mig var jag skulle behöva det här, men jag tror att det är väldigt användbart. Och viktigast av allt, jag behöver inte hålla mig till standardsträngar eller numeriska värden."
"Japp. Det här är praktiskt till exempel när du skriver ett program som utbyter meddelanden med till exempel en Facebook-server, och de har en tilldelad uppsättning värden. Du behöver bara tilldela dem till deras egen enum så kommer allt att fungera. "
"Det är underbart. Jag gillar definitivt JAXB."
"Jättebra. Då var det allt för idag. Gå och ta en paus."