"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: "

Converter um objeto de 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);
}
Uma classe cujos objetos são desserializados de XML
@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:"

XML de amostra que requer a anotação @XmlMixed
<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
@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
}

"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."