„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: ”
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 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:”
<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 |
---|---|
|
|
„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ę”.
GO TO FULL VERSION