"Ok, então. Como você provavelmente já adivinhou, isso não foi tudo."
"Agora falarei sobre vários outros aspectos do JAXB. Mas, como fizemos com o JSON, começaremos com as coleções."
"Ao desserializar coleções usando JAXB, também há incerteza sobre qual coleção específica (ArrayList, LinkedList, Vector, etc.) usar para a variável List. E, novamente, a resposta a essa pergunta é fornecida por anotações."
"É tudo muito simples. Se o tipo de coleção não for especificado em sua anotação, o JAXB tentará selecionar a coleção mais adequada usando seu tipo. Para uma lista, será ArrayList; para um mapa, será HashMap, etc. ."
"Na realidade, há muito menos problemas aqui do que com JSON, porque cada classe tem uma tag exclusiva e você pode usar a tag para especificar a classe exata."
"Por exemplo, se você precisar desserializar um grupo de elementos que herdam um ancestral comum, use a anotação @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<Object> animais; } @XmlType(name = "cat") @XmlRootElement class Cat { public String name; público int idade; peso int público ; Gato() { } } @XmlType(name = "dog") @XmlRootElement class Dog { public String name; público int idade; peso int público ; Gato() { } }
"Se uma coleção é marcada com a anotação @XmlAny , qualquer objeto adequado pode ser colocado nela. E o JAXB Unmarshaller presta atenção às tags ao preencher a coleção."
"Nesse caso, a sequência de tags " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " será convertida em uma coleção com objetos Cat, Cat, Dog e Cat ."
"Isso é mais ou menos o que eu esperava."
"Uh-huh. Ah, a propósito, mais uma coisa. Se você desserializar uma mistura de texto e tags, precisará usar a anotação @XmlMixed ."
"Aqui está um exemplo deste tipo de XML:"
<data> <items> teste 1 <item/> texto 2 <item> nome </item> texto 3 </items> </data>
"Nossa. Tinha esquecido que esse XML existe. Acostumei-me com tudo bonito, com tags embutidas e tudo mais."
"Ele existe. E o JAXB tem uma anotação mesmo para este caso!"
"Ótimo. A propósito, eu queria perguntar: como os enums são serializados?"
"Boa pergunta! Boa pegadinha! De alguma forma eu pulei esse tópico."
"Existe uma anotação especial @XmlEnum que deve ser usada para marcar enums. Você pode usá-la para especificar se os valores serão armazenados como números ou strings."
"Há também uma anotação @XmlEnumValue que permite especificar o valor que corresponderá a um determinado campo enum."
"Aqui estão alguns exemplos:"
Números | Cordas |
---|---|
|
|
"Santo Deus. Não consigo imaginar onde precisaria disso, mas acho que é muito útil. E o mais importante, não preciso me ater a strings padrão ou valores numéricos."
"Sim. Isso é útil, por exemplo, quando você escreve um programa que troca mensagens com, digamos, um servidor do Facebook, e eles têm um conjunto de valores atribuídos. Você só precisa atribuí-los a seu próprio enum e tudo funcionará. "
"Isso é maravilhoso. Eu definitivamente gosto de JAXB."
"Ótimo. Então é isso por hoje. Vá e faça uma pausa."
GO TO FULL VERSION