"Rendben, akkor. Ahogy valószínűleg már sejtette, ez nem minden."

"Most a JAXB több más vonatkozásáról is mesélek. De ahogy a JSON-nál is tettük, most is a gyűjteményekkel kezdjük."

"A gyűjtemények JAXB használatával történő deszerializálása során az is bizonytalan, hogy melyik gyűjteményt (ArrayList, LinkedList, Vector stb.) használja a Lista változóhoz. És erre a kérdésre ismét az annotációk adják a választ."

"Minden nagyon egyszerű. Ha a gyűjtemény típusa nincs megadva a megjegyzésében, akkor a JAXB megpróbálja kiválasztani a legmegfelelőbb gyűjteményt a típusa alapján. Lista esetén ez ArrayList, térképnél HashMap stb. ."

"A valóságban itt sokkal kevesebb probléma van, mint a JSON-nál, mert minden osztálynak egyedi címkéje van, és a címkével megadhatja a pontos osztályt."

"Ha például olyan elemcsoportot kell deszerializálnia, amely közös őst örököl, használja az  @XmlAny: megjegyzést."

Objektumok konvertálása XML-ből
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);
}
Osztály, amelynek objektumai XML-ből deszerializáltak
@XmlType(név = "állatkert") 
@XmlRootElement 
osztály  Állatkert 
{ 
@XmlAny public  List<Object> állatok; } 
 


@XmlType(név = "macska") 
@XmlRootElement 
class  Cat 
{ 
public  String name; nyilvános  int kor; nyilvános  int súly; 
 
 

 Cat() 
 { 
 } 
}

@XmlType(név = "kutya") 
@XmlRootElement 
osztály  Kutya 
{ 
public  String name; nyilvános  int kor; nyilvános  int súly; 
 
 

 Cat() 
 { 
 } 

"Ha egy gyűjtemény @XmlAny annotációval van megjelölve, akkor tetszőleges megfelelő objektum kerülhet bele. A JAXB Unmarshaller pedig a gyűjtemény feltöltésekor figyel a címkékre."

"Ebben az esetben a(z) " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " címkesorozat egy macska, macska, kutya és macska objektumokat tartalmazó gyűjteménymé alakul. ."

– Körülbelül erre számítottam.

"Aha. Apropó, még egy dolog. Ha a szöveg és a címkék keverékét deszerializálja, akkor az @XmlMixed annotációt kell használnia."

"Íme egy példa az ilyen típusú XML-re:"

Minta XML, amelyhez @XmlMixed megjegyzés szükséges
<data> 
<items> 
teszt 1 <item/> text 2 <item> name </item> text 3 </items> </data> 

 

 

 

"Hűha. Elfelejtettem, hogy létezik ilyen XML. Megszoktam, hogy minden szép, beágyazott címkékkel és minden mással."

"Létezik. És a JAXB-nek még erre az esetre is van megjegyzése!"

"Remek. Egyébként meg akartam kérdezni: hogyan készülnek az enumok sorozatosítása?"

"Jó kérdés! Szép fogás! Valahogy kihagytam ezt a témát."

"Van egy speciális @XmlEnum annotáció, amelyet az enumok jelölésére kell használni. Ezzel megadhatja, hogy az értékek számokként vagy karakterláncokként legyenek tárolva."

"Van egy @XmlEnumValue megjegyzés is, amely lehetővé teszi egy adott enum mezőnek megfelelő érték megadását."

"Íme néhány példa:"

Számok Húrok
@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
}

"Szent moly. Nem tudom elképzelni, hol lenne szükségem erre, de szerintem nagyon hasznos. És ami a legfontosabb, nem kell ragaszkodnom a szabványos karakterláncokhoz vagy numerikus értékekhez."

"Igen. Ez praktikus, ha például írsz egy programot, amely üzeneteket cserél mondjuk egy Facebook szerverrel, és hozzájuk van egy értékkészletük. Csak hozzá kell rendelned őket a saját enumhoz, és minden működni fog. "

"Ez csodálatos. Határozottan szeretem a JAXB-t."

"Remek. Akkor mára ennyi. Menj és tarts egy kis szünetet."