— Bine, atunci. După cum probabil ai ghicit deja, asta nu a fost totul.

„Acum vă voi spune despre alte câteva aspecte ale JAXB. Dar așa cum am făcut cu JSON, vom începe cu colecții.”

„La deserializarea colecțiilor folosind JAXB, există, de asemenea, incertitudinea cu privire la ce colecție anume (ArrayList, LinkedList, Vector etc.) să fie utilizată pentru variabila List. Și din nou răspunsul la această întrebare este oferit de adnotări.”

„Totul este destul de simplu. Dacă tipul de colecție nu este specificat în adnotarea sa, atunci JAXB va încerca să selecteze cea mai potrivită colecție folosind tipul acesteia. Pentru o Listă, aceasta va fi ArrayList; pentru o Hartă, va fi HashMap etc. ."

„În realitate, există mult mai puține probleme aici decât cu JSON, deoarece fiecare clasă are o etichetă unică și puteți folosi eticheta pentru a specifica clasa exactă.”

„De exemplu, dacă trebuie să deserializați un grup de elemente care moștenesc un strămoș comun, utilizați  adnotarea @XmlAny:

Convertiți un obiect din 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);
}
O clasă ale cărei obiecte sunt deserializate din XML
@XmlType(name = "zoo") 
@XmlRootElement 
clasa  Zoo 
{ 
@XmlAny public  List<Object> animal; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; public  int age; public  int pondere; 
 
 

 Cat() 
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; public  int age; public  int pondere; 
 
 

 Cat() 
 { 
 } 

„Dacă o colecție este marcată cu adnotarea @XmlAny , atunci orice obiect potrivit poate fi pus în ea. Iar JAXB Unmarshaller acordă atenție etichetelor atunci când populează colecția.”

„În acest caz, secvența de etichete „ <zoo> <cat/><cat/> <dog/> <cat/> </zoo> „ va fi convertită într-o colecție cu obiecte Cat, Cat, Dog și Cat ."

— Cam la asta mă așteptam.

"Uh-huh. Apropo, încă ceva. Dacă deserializați un amestec de text și etichete, trebuie să utilizați adnotarea @XmlMixed ."

„Iată un exemplu de acest tip de XML:”

Exemplu de XML care necesită adnotarea @XmlMixed
<date> 
<item> 
test 1 <item/> text 2 <item> nume </item> text 3 </items> </data> 

 

 

 

"Uau. Uitasem că există un astfel de XML. M-am obișnuit ca totul să fie frumos, cu etichete încorporate și orice altceva."

"Există. Și JAXB are o adnotare chiar și pentru acest caz!"

"Genial. Apropo, am vrut să întreb: cum sunt serializate enumerarile?"

"Bună întrebare! Frumoasă captură! Am sărit cumva acest subiect."

„Există o adnotare specială @XmlEnum care trebuie utilizată pentru a marca enumerarea. O puteți folosi pentru a specifica dacă valorile vor fi stocate ca numere sau șiruri.”

„Există și o adnotare @XmlEnumValue care vă permite să specificați valoarea care va corespunde unui anumit câmp de enumerare.”

"Aici sunt cateva exemple:"

Numerele Siruri de caractere
@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. Nu îmi pot imagina unde aș avea nevoie de asta, dar cred că este foarte util. Și, cel mai important, nu trebuie să mă țin de șiruri standard sau de valori numerice."

„Da. Acest lucru este la îndemână, de exemplu, când scrii un program care schimbă mesaje cu, să zicem, un server Facebook și au un set de valori alocat. Trebuie doar să le alocați propriei enum și totul va funcționa. "

"Este minunat. Cu siguranță îmi place JAXB."

"Genial. Atunci asta e tot pentru azi. Du-te și ia o pauză."