— Добре тогава. Както сигурно вече се досещате, това не беше всичко.

„Сега ще ви разкажа за няколко други аспекта на JAXB. Но Howто направихме с JSON, ще започнем с колекции.“

„Когато десериализираме колекции с помощта на JAXB, също има несигурност относно това коя конкретна колекция (ArrayList, LinkedList, Vector и т.н.) да се използва за променливата List. И отново отговорът на този въпрос се предоставя от анотации.“

„Всичко е доста просто. Ако типът на колекцията не е посочен в нейната анотация, тогава JAXB ще се опита да избере най-подходящата колекция, използвайки нейния тип. За списък това ще бъде ArrayList; за карта ще бъде HashMap и т.н. ."

„В действителност има много по-малко проблеми тук, отколкото с JSON, защото всеки клас има уникален таг и можете да използвате етикета, за да посочите точния клас.“

„Например, ако трябва да десериализирате група от елементи, които наследяват общ предшественик, използвате  анотацията @XmlAny:

Конвертиране на обект от 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);
}
Клас, чиито обекти са десериализирани от XML
@XmlType(name = "zoo") 
@XmlRootElement 
клас  Zoo 
{ 
@XmlAny публичен  списък<Object> животни; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; публична  възраст; public  int тегло; 
 
 

 Cat() 
 { 
 } 
}

@XmlType(име = "куче") 
@XmlRootElement 
клас  Куче 
{ 
публично  име на низ; публична  възраст; public  int тегло; 
 
 

 Cat() 
 { 
 } 

„Ако една колекция е маркирана с анотацията @XmlAny , тогава в нея могат да бъдат поставени всяHowви подходящи обекти. И JAXB Unmarshaller обръща внимание на таговете, когато попълва колекцията.“

„В този случай поредицата от тагове „ <zoo> <cat/><cat/> <dog/> <cat/> </zoo> “ ще бъде преобразувана в колекция с обекти Cat, Cat, Dog и Cat ."

— Горе-долу това очаквах.

„Ъ-ъъ. О, между другото, още нещо. Ако десериализирате смес от текст и етикети, трябва да използвате анотацията @XmlMixed .“

„Ето пример за този тип XML:“

Примерен XML, който изисква анотацията @XmlMixed
<данни> 
<items> 
тест 1 <item/> текст 2 <item> име </item> текст 3 </items> </data> 

 

 

 

„Уау. Бях забравил, че съществува такъв XML. Свикнах всичко да е красиво, с вградени тагове и всичко останало.“

„Съществува. И JAXB има анотация дори за този случай!“

„Страхотно. Между другото, исках да попитам: How се сериализират enum-ите?“

„Добър въпрос! Добър улов! НяHow си пропуснах тази тема.“

"Има специална анотация @XmlEnum, която трябва да се използва за маркиране на enums. Можете да я използвате, за да посочите дали стойностите ще се съхраняват като числа or низове."

„Има и анотация @XmlEnumValue, която ви позволява да посочите стойността, която ще съответства на конкретно поле enum.“

"Ето няколко примера:"

Числа струни
@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
}

„За бога. Не мога да си представя къде ще ми трябва това, но мисля, че е много полезно. И най-важното е, че не трябва да се придържам към стандартни низови or числови стойности.“

„Да. Това е удобно, например, когато пишете програма, която обменя съобщения с, да речем, сървър на Facebook и те имат присвоен набор от стойности. Просто трябва да ги присвоите на техния собствен списък и всичко ще работи. "

„Това е прекрасно. Определено харесвам JAXB.“

"Страхотно. Тогава това е всичко за днес. Отидете и си починете."