„No dobrze. Jak już pewnie się domyśliłeś, to nie było wszystko”.

„Teraz opowiem ci o kilku innych aspektach JAXB. Ale tak jak w przypadku JSON, zaczniemy od kolekcji”.

„Podczas deserializacji kolekcji za pomocą JAXB istnieje również niepewność co do tego, której konkretnej kolekcji (ArrayList, LinkedList, Vector itp.) Należy użyć dla zmiennej List. I znowu odpowiedź na to pytanie jest dostarczana przez adnotacje”.

„To wszystko jest całkiem proste. Jeśli typ kolekcji nie jest określony w adnotacji, JAXB spróbuje wybrać najbardziej odpowiednią kolekcję na podstawie jej typu. W przypadku listy będzie to ArrayList, w przypadku mapy będzie to HashMap itp. ”.

„W rzeczywistości jest tu znacznie mniej problemów niż w przypadku JSON, ponieważ każda klasa ma unikalny znacznik, którego można użyć do określenia dokładnej klasy”.

„Na przykład, jeśli chcesz deserializować grupę elementów, które dziedziczą wspólnego przodka, użyj  adnotacji @XmlAny:

Konwertuj obiekt z 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);
}
Klasa, której obiekty są deserializowane z XML
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Obiekt> zwierzęta; } 
 


@XmlType(nazwa = "kot") 
@XmlRootElement 
klasa  Kot 
{ 
public  Nazwa ciągu znaków; publiczny  w wieku; publiczna  waga całkowita; 
 
 

 Kot() 
 { 
 } 
}

@XmlType(nazwa = "pies") 
@XmlRootElement 
klasa  Pies 
{ 
public  String nazwa; publiczny  w wieku; publiczna  waga całkowita; 
 
 

 Kot() 
 { 
 } 

„Jeśli kolekcja jest oznaczona adnotacją @XmlAny , można w niej umieścić dowolne odpowiednie obiekty. A JAXB Unmarshaller zwraca uwagę na tagi podczas zapełniania kolekcji”.

„W tym przypadku sekwencja znaczników „ <zoo> <cat/><cat/> <dog/> <cat/> </zoo> ” zostanie przekształcona w kolekcję z obiektami Kot, Kot, Pies i Kot ”.

– To mniej więcej to, czego się spodziewałem.

„Uh-huh. A tak przy okazji, jeszcze jedno. Jeśli deserializujesz mieszaninę tekstu i tagów, musisz użyć adnotacji @XmlMixed ”.

„Oto przykład tego typu XML:”

Przykładowy kod XML, który wymaga adnotacji @XmlMixed
<data> 
<items> 
test 1 <item/> tekst 2 <item> nazwa </item> tekst 3 </items> </data> 

 

 

 

„Wow. Zapomniałem, że taki XML istnieje. Przyzwyczaiłem się, że wszystko jest ładne, z osadzonymi tagami i wszystkim innym”.

„To istnieje. A JAXB ma adnotację nawet w tym przypadku!”

„Świetnie. A tak przy okazji, chciałem zapytać: w jaki sposób są serializowane wyliczenia?”

„Dobre pytanie! Niezły chwyt! Jakoś pominąłem ten temat”.

„Istnieje specjalna adnotacja @XmlEnum, której należy używać do oznaczania wyliczeń. Możesz jej użyć do określenia, czy wartości będą przechowywane jako liczby, czy ciągi”.

„Istnieje również adnotacja @XmlEnumValue, która pozwala określić wartość, która będzie odpowiadać określonemu polu enum”.

„Oto kilka przykładów:”

Liczby Smyczki
@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
}

„Jasna cholera. Nie mogę sobie wyobrazić, gdzie miałbym tego potrzebować, ale myślę, że jest to bardzo przydatne. A co najważniejsze, nie muszę trzymać się standardowych wartości łańcuchowych ani liczbowych”.

„Tak. Jest to przydatne na przykład, gdy piszesz program, który wymienia wiadomości z, powiedzmy, serwerem Facebooka i mają przypisany zestaw wartości. Wystarczy przypisać je do własnego wyliczenia i wszystko będzie działać. "

„To wspaniale. Zdecydowanie lubię JAXB”.

„Świetnie. To tyle na dzisiaj. Idź i zrób sobie przerwę”.