"Okay, så. Som du sikkert allerede har gættet, var det ikke alt."

"Nu vil jeg fortælle dig om flere andre aspekter af JAXB. Men som vi gjorde med JSON, vil vi begynde med samlinger."

"Når man deserialiserer samlinger ved hjælp af JAXB, er der også usikkerhed om, hvilken bestemt samling (ArrayList, LinkedList, Vector osv.) der skal bruges til List-variablen. Og igen er svaret på dette spørgsmål givet af annoteringer."

"Det hele er ret simpelt. Hvis samlingstypen ikke er angivet i dens annotation, så vil JAXB forsøge at vælge den mest passende samling ved hjælp af dens type. For en liste vil dette være ArrayList; for et kort vil det være HashMap osv. ."

"I virkeligheden er der langt færre problemer her end med JSON, fordi hver klasse har et unikt tag, og du kan bruge tagget til at angive den nøjagtige klasse."

"Hvis du f.eks. har brug for at deserialisere en gruppe af elementer, der arver en fælles forfader, bruger du  @XmlAny: annotationen"

Konverter et objekt fra 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 klasse, hvis objekter er deserialiseret fra XML
@XmlType(navn = "zoo") 
@XmlRootElement 
klasse  Zoo 
{ 
@XmlEnhver offentlig  liste<Object> dyr; } 
 


@XmlType(navn = "kat") 
@XmlRootElement 
klasse  Cat 
{ 
public  String name; offentlig  int alder; offentlig  int vægt; 
 
 

 Cat() 
 { 
 } 
}

@XmlType(navn = "hund") 
@XmlRootElement 
klasse  Hund 
{ 
public  String name; offentlig  int alder; offentlig  int vægt; 
 
 

 Cat() 
 { 
 } 

"Hvis en samling er markeret med @XmlAny- annotationen, kan alle passende objekter lægges i den. Og JAXB Unmarshaller er opmærksom på tags, når samlingen udfyldes."

"I dette tilfælde vil sekvensen af ​​tags " <zoo> <kat/><kat/> <hund/> <kat/> </zoo> " blive konverteret til en samling med kat, kat, hund og kat objekter ."

"Det var omtrent, hvad jeg forventede."

"Uh-huh. Åh, forresten, en ting mere. Hvis du deserialiserer en blanding af tekst og tags, skal du bruge @XmlMixed- annotationen."

"Her er et eksempel på denne type XML:"

Eksempel på XML, der kræver @XmlMixed-annotationen
<data> 
<items> 
test 1 <item/> tekst 2 <item> navn </item> tekst 3 </items> </data> 

 

 

 

"Wow. Jeg havde glemt, at sådan XML findes. Jeg vænnede mig til, at alt var smukt, med indlejrede tags og alt muligt andet."

"Det eksisterer. Og JAXB har en anmærkning selv for denne sag!"

"Fantastisk. Forresten, jeg ville spørge: hvordan serialiseres enums?"

"Godt spørgsmål! Godt fangst! Jeg sprang på en eller anden måde over det emne."

"Der er en speciel @XmlEnum annotation, der skal bruges til at markere enums. Du kan bruge den til at angive, om værdierne skal gemmes som tal eller strenge."

"Der er også en @XmlEnumValue-annotation, der lader dig angive den værdi, der svarer til et bestemt enum-felt."

"Her er nogle eksempler:"

Tal Strenge
@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. Jeg kan ikke forestille mig, hvor jeg får brug for dette, men jeg tror, ​​det er meget nyttigt. Og vigtigst af alt, jeg behøver ikke at holde mig til standardstreng eller numeriske værdier."

"Jep. Det er f.eks. praktisk, når du skriver et program, der udveksler beskeder med f.eks. en Facebook-server, og de har et tildelt sæt værdier. Du skal bare tildele dem til deres egen enum, og alt vil fungere. "

"Det er vidunderligt. Jeg kan bestemt godt lide JAXB."

"Fantastisk. Så er det det for i dag. Gå og tag en pause."