"Va bene, allora. Come probabilmente avrai già intuito, non era tutto."

"Ora ti parlerò di molti altri aspetti di JAXB. Ma come abbiamo fatto con JSON, inizieremo con le raccolte."

"Durante la deserializzazione delle raccolte utilizzando JAXB, c'è anche incertezza su quale particolare raccolta (ArrayList, LinkedList, Vector, ecc.) utilizzare per la variabile List. E ancora una volta la risposta a questa domanda è fornita dalle annotazioni."

"È tutto piuttosto semplice. Se il tipo di raccolta non è specificato nella sua annotazione, JAXB proverà a selezionare la raccolta più appropriata utilizzando il suo tipo. Per un elenco, questo sarà ArrayList; per una mappa, sarà HashMap, ecc. ."

"In realtà, qui ci sono molti meno problemi che con JSON, perché ogni classe ha un tag univoco e puoi usare il tag per specificare la classe esatta."

"Ad esempio, se devi deserializzare un gruppo di elementi che ereditano un antenato comune, utilizza l'  annotazione @XmlAny: "

Converti un oggetto da 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);
}
Una classe i cui oggetti sono deserializzati da XML
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> animali; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; pubblico  int età; peso int pubblico  ; 
 
 

 Gatto() 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; pubblico  int età; peso int pubblico  ; 
 
 

 Gatto() 
 { 
 } 

"Se una raccolta è contrassegnata con l' annotazione @XmlAny , è possibile inserire qualsiasi oggetto adatto. E JAXB Unmarshaller presta attenzione ai tag durante il popolamento della raccolta."

"In questo caso, la sequenza di tag " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " verrà convertita in una raccolta con oggetti Cat, Cat, Dog e Cat ."

"È più o meno quello che mi aspettavo."

"Uh-huh. Oh, a proposito, un'altra cosa. Se deserializzi una combinazione di testo e tag, devi usare l' annotazione @XmlMixed ."

"Ecco un esempio di questo tipo di XML:"

XML di esempio che richiede l'annotazione @XmlMixed
<data> 
<items> 
test 1 <item/> testo 2 <item> nome </item> testo 3 </items> </data> 

 

 

 

"Wow. Avevo dimenticato che tale XML esiste. Mi sono abituato a tutto ciò che è carino, con tag incorporati e tutto il resto."

"Esiste. E JAXB ha un'annotazione anche per questo caso!"

"Fantastico. A proposito, volevo chiedere: come vengono serializzate le enum?"

"Bella domanda! Bella presa! In qualche modo ho saltato quell'argomento."

"Esiste un'annotazione @XmlEnum speciale che deve essere utilizzata per contrassegnare gli enum. È possibile utilizzarla per specificare se i valori verranno archiviati come numeri o stringhe."

"Esiste anche un'annotazione @XmlEnumValue che consente di specificare il valore che corrisponderà a un particolare campo enum."

"Ecco alcuni esempi:"

Numeri stringhe
@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
}

"Santo cielo. Non riesco a immaginare dove avrei bisogno di questo, ma penso che sia molto utile. E, cosa più importante, non devo attenermi a stringhe standard o valori numerici."

"Sì. Questo è utile, ad esempio, quando scrivi un programma che scambia messaggi con, diciamo, un server Facebook, e hanno un set di valori assegnato. Devi solo assegnarli al proprio enum e tutto funzionerà. "

"È meraviglioso. Mi piace decisamente JAXB."

"Fantastico. Allora è tutto per oggi. Vai a prenderti una pausa."