— Добре тогава. Както сигурно вече се досещате, това не беше всичко.
„Сега ще ви разкажа за няколко други аспекта на JAXB. Но Howто направихме с JSON, ще започнем с колекции.“
„Когато десериализираме колекции с помощта на JAXB, също има несигурност относно това коя конкретна колекция (ArrayList, LinkedList, Vector и т.н.) да се използва за променливата List. И отново отговорът на този въпрос се предоставя от анотации.“
„Всичко е доста просто. Ако типът на колекцията не е посочен в нейната анотация, тогава JAXB ще се опита да избере най-подходящата колекция, използвайки нейния тип. За списък това ще бъде ArrayList; за карта ще бъде HashMap и т.н. ."
„В действителност има много по-малко проблеми тук, отколкото с JSON, защото всеки клас има уникален таг и можете да използвате етикета, за да посочите точния клас.“
„Например, ако трябва да десериализирате група от елементи, които наследяват общ предшественик, използвате анотацията @XmlAny: “
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);
}
@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:“
<данни> <items> тест 1 <item/> текст 2 <item> име </item> текст 3 </items> </data>
„Уау. Бях забравил, че съществува такъв XML. Свикнах всичко да е красиво, с вградени тагове и всичко останало.“
„Съществува. И JAXB има анотация дори за този случай!“
„Страхотно. Между другото, исках да попитам: How се сериализират enum-ите?“
„Добър въпрос! Добър улов! НяHow си пропуснах тази тема.“
"Има специална анотация @XmlEnum, която трябва да се използва за маркиране на enums. Можете да я използвате, за да посочите дали стойностите ще се съхраняват като числа or низове."
„Има и анотация @XmlEnumValue, която ви позволява да посочите стойността, която ще съответства на конкретно поле enum.“
"Ето няколко примера:"
Числа | струни |
---|---|
|
|
„За бога. Не мога да си представя къде ще ми трябва това, но мисля, че е много полезно. И най-важното е, че не трябва да се придържам към стандартни низови or числови стойности.“
„Да. Това е удобно, например, когато пишете програма, която обменя съобщения с, да речем, сървър на Facebook и те имат присвоен набор от стойности. Просто трябва да ги присвоите на техния собствен списък и всичко ще работи. "
„Това е прекрасно. Определено харесвам JAXB.“
"Страхотно. Тогава това е всичко за днес. Отидете и си починете."
GO TO FULL VERSION