"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"

Konvertera ett objekt från 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);
}
En klass vars objekt är deserialiserade från XML
@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:"

Exempel på XML som kräver @XmlMixed-kommentaren
<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
@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. 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."