lunes, 31 de enero de 2011

Como usar XStream en Java


XStream es una interesante y simple libreria para serializar objetos a XML y viceversa.


Caracteristicas de XStream
  • Fácil de usar. Cuenta una fachada de alto nivel que simplifica los casos más comunes de uso.
  • No requiere homologaciones “mappings”. La mayoría de los objetos se puede serilizar sin necesidad de crear archivos de homologación o “mapping”.
  • Rendimiento. Velocidad y bajo consumo de memoria son parte esencial del diseño, lo que hace que XStream sea adecuada sistemas con grandes objetos o alta demanda de envío de mensajes.
  • XML Limpio. XStream usa “reflection” y crea archivos XML facilmente entendibles por humanos y más compactos que usando la serialización nativa de Java.
  • No requiere modificar los objetos. Se serializan los campos internos, incluyendo privados y finales. Las clases internas y no publicas son soportadas. No se requiere que las clases tengan un constructor por defecto (sin parametros).
  • Soporte completo para objetos complejos. Las referencias duplicadas (duplicate references) encontradas en el objeto se mantienen. Soporta referencias duplicadas (circular references).
  • Integración con otras API de XML. Implementado un interfaz, Xstream puede serializar directamente hacia/desde cualquier estructura de arbol (tree structure) no sólo XML.
  • Estratégias de conversión personalizables. Las estrategias de conversión se pueden registrar permitiendo personalizar como los tipos son representados en XML.
  • Mensajes de error. Cuando una excepción, por XML mal formado, es encontrada se provee un diagnostico detallado para ayudar a encontrar y solucionar el problema.
  • Formato se salida alterno. El diseño modular permite otros formatos de salida. Xstream tiene actualmente soporte para JSON.


Manos a la obra:
Pueden consultar el tutorial de dos minutos en el cual me estoy basando para este post, con algunos detalles adicionales.

Estoy omitiendo los constructores y métodos para ahorrar espacio ;-)
Supongamos que tenemos los siguientes POJOs (Plain Old Java Object) :

ejemplo 1 - pojos
public class PhoneNumber {
  private int code;
  private String number;
  // ... constructores y métodos 
}
public class Person {
  private String firstname;
  private String lastname;
  private PhoneNumber phone;
  private PhoneNumber fax;
  // ... constructores y métodos
}

El siguiente es un ejemplo de como serializar un objeto tipo Person:

ejemplo 2 - usando XStream
XStream xstream = new XStream();
//[1] alias opcionales
xstream.alias("person", Person.class);

Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));
joe.setFax(new PhoneNumber(123, "9999-999"));
String xml = xstream.toXML(joe);

ejemplo 2.1 - contenido de la variable xml

    Joe
    Walnes
    
      123
      1234-456
    
    
      123
      9999-999
    
  

Para convertir de XML a un objeto java:

ejemplo 2.2 - xml a java.
//usamos la variable xml del ejemplo 2
Person newJoe = (Person)xstream.fromXML(xml);

En el siguiente post hablaré sobre las Anotaciones en XStream.


[Notas]
1 Sino agregamos los alias opcionales el código aun funcionará pero los etiquetas de los elementos contendrán el nombre completo de cada clase (fully qualified name).