"Ok, da. Som du sikkert allerede har gjettet, var det ikke alt."

"Nå skal jeg fortelle deg om flere andre aspekter ved JAXB. Men som vi gjorde med JSON, vil vi begynne med samlinger."

"Når du deserialiserer samlinger med JAXB, er det også usikkerhet om hvilken spesiell samling (ArrayList, LinkedList, Vector, etc.) som skal brukes for List-variabelen. Og igjen er svaret på dette spørsmålet gitt av merknader."

"Det hele er ganske enkelt. Hvis samlingstypen ikke er spesifisert i merknaden, vil JAXB prøve å velge den mest passende samlingen ved hjelp av typen. For en liste vil dette være ArrayList; for et kart vil det være HashMap, osv. ."

"I virkeligheten er det langt færre problemer her enn med JSON, fordi hver klasse har en unik tag, og du kan bruke taggen til å spesifisere den eksakte klassen."

"For eksempel, hvis du trenger å deserialisere en gruppe elementer som arver en felles stamfar, bruker du  @XmlAny: -kommentaren"

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 deserialisert fra XML
@XmlType(navn = "zoo") 
@XmlRootElement 
klasse  Zoo 
{ 
@XmlAlle offentlige  liste<Object> dyr; } 
 


@XmlType(navn = "katt") 
@XmlRootElement 
class  Cat 
{ 
public  String name; offentlig  int alder; offentlig  int vekt; 
 
 

 Cat() 
 { 
 } 
}

@XmlType(navn = "hund") 
@XmlRootElement 
class  Dog 
{ 
public  String name; offentlig  int alder; offentlig  int vekt; 
 
 

 Cat() 
 { 
 } 

"Hvis en samling er merket med @XmlAny -kommentaren, kan alle passende objekter legges inn i den. Og JAXB Unmarshaller tar hensyn til taggene når samlingen fylles ut."

"I dette tilfellet vil sekvensen av tagger " <zoo> <katt/><katt/> <hund/> <katt/> </zoo> " bli konvertert til en samling med katt-, katt-, hund- og kattobjekter ."

— Det var omtrent det jeg forventet.

"Uh-he. Å, forresten, en ting til. Hvis du deserialiserer en blanding av tekst og tagger, må du bruke @XmlMixed- kommentaren."

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

Eksempel på XML som krever @XmlMixed-kommentaren
<data> 
<items> 
test 1 <item/> tekst 2 <item> navn </item> tekst 3 </items> </data> 

 

 

 

"Wow. Jeg hadde glemt at slik XML eksisterer. Jeg ble vant til at alt var pent, med innebygde tagger og alt annet."

"Det finnes. Og JAXB har en merknad selv for denne saken!"

"Flott. Forresten, jeg ønsket å spørre: hvordan er enums serialisert?"

"Godt spørsmål! Fin fangst! Jeg hoppet på en måte over det emnet."

"Det er en spesiell @XmlEnum-merknad som må brukes for å merke opptegnelser. Du kan bruke den til å spesifisere om verdiene skal lagres som tall eller strenger."

"Det er også en @XmlEnumValue-annotering som lar deg spesifisere verdien som skal tilsvare et bestemt enum-felt."

"Her er noen eksempler:"

Tall Strenger
@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 meg hvor jeg trenger dette, men jeg tror det er veldig nyttig. Og viktigst av alt, jeg trenger ikke å holde meg til standard streng eller numeriske verdier."

"Jepp. Dette er for eksempel nyttig når du skriver et program som utveksler meldinger med for eksempel en Facebook-server, og de har et tilordnet sett med verdier. Du trenger bare å tilordne dem til deres egen enum og alt vil fungere. "

"Det er fantastisk. Jeg liker definitivt JAXB."

"Flott. Så var det det for i dag. Gå og ta en pause."