"Está bien, entonces. Como probablemente ya habrás adivinado, eso no fue todo".

"Ahora les contaré sobre varios otros aspectos de JAXB. Pero como hicimos con JSON, comenzaremos con las colecciones".

"Al deserializar colecciones usando JAXB, también existe incertidumbre sobre qué colección en particular (ArrayList, LinkedList, Vector, etc.) usar para la variable List. Y nuevamente, las anotaciones proporcionan la respuesta a esta pregunta".

"Todo es bastante simple. Si el tipo de colección no se especifica en su anotación, entonces JAXB intentará seleccionar la colección más apropiada usando su tipo. Para una Lista, será ArrayList; para un Mapa, será HashMap, etc. ."

"En realidad, hay muchos menos problemas aquí que con JSON, porque cada clase tiene una etiqueta única y puede usar la etiqueta para especificar la clase exacta".

"Por ejemplo, si necesita deserializar un grupo de elementos que heredan un ancestro común, use la  anotación @XmlAny: "

Convertir un 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);
}
Una clase cuyos objetos se deserializan de XML
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> animales; } 
 


@XmlType(nombre = "gato") 
@XmlRootElement 
class  Gato 
{ 
public  String nombre;  edad pública int; peso público  int; 
 
 

 gato() 
 { 
 } 
}

@XmlType(nombre = "perro") 
@XmlRootElement 
class  Perro 
{ 
public  String nombre;  edad pública int;  peso público int; 
 
 

 gato() 
 { 
 } 

"Si una colección está marcada con la anotación @XmlAny , entonces se pueden colocar en ella los objetos adecuados. Y JAXB Unmarshaller presta atención a las etiquetas al completar la colección".

"En este caso, la secuencia de etiquetas " <zoo> <cat/><cat/> <dog/> <cat/> </zoo> " se convertirá en una colección con objetos Cat, Cat, Dog y Cat ."

"Eso es más o menos lo que esperaba".

"Ajá. Oh, por cierto, una cosa más. Si deserializa una mezcla de texto y etiquetas, necesita usar la anotación @XmlMixed ".

"Aquí hay un ejemplo de este tipo de XML:"

Ejemplo de XML que requiere la anotación @XmlMixed
<datos> 
<elementos> 
prueba 1 <elemento/> texto 2 <elemento> nombre </elemento> texto 3 </elementos> </datos> 

 

 

 

"Vaya. Había olvidado que existe ese XML. Me acostumbré a que todo fuera bonito, con etiquetas incrustadas y todo lo demás".

"Sí existe. ¡Y JAXB tiene una anotación incluso para este caso!"

"Genial. Por cierto, quería preguntar: ¿cómo se serializan las enumeraciones?"

"¡Buena pregunta! ¡Buena captura! De alguna manera me salté ese tema".

"Hay una anotación especial @XmlEnum que debe usarse para marcar enumeraciones. Puede usarla para especificar si los valores se almacenarán como números o cadenas".

"También hay una anotación @XmlEnumValue que le permite especificar el valor que corresponderá a un campo de enumeración en particular".

"Aquí hay unos ejemplos:"

Números Instrumentos de cuerda
@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
}

"Holy moly. No puedo imaginar dónde necesitaría esto, pero creo que es muy útil. Y lo más importante, no tengo que ceñirme a cadenas estándar o valores numéricos".

"Sí. Esto es útil, por ejemplo, cuando escribes un programa que intercambia mensajes con, digamos, un servidor de Facebook, y tienen un conjunto de valores asignados. Solo necesitas asignarlos a su propia enumeración y todo funcionará. "

"Eso es maravilloso. Definitivamente me gusta JAXB".

"Genial. Entonces eso es todo por hoy. Ve y tómate un descanso".