XStream: Como usar los conversores

Como hemos visto en el post anterior de XStream (XStream: De objetos a XML de forma simple), a la hora de trabajar con objetos y generar un XML a partir de ellos o viceversa esta librería es ideal. Ahora bien existen situaciones en las cuales deberemos cambiar el formato en que se exporta el dato al XML, agregar o quitar nodos dependiendo de alguna condición lo cual podría ser engorroso y seria lógico pensar en hacer todo este trabajo a mano en lugar de usar esta librería.

XStream ha ido mejorando versión a versión y con ello trajo consigo la posibilidad de usar conversores que nos permiten modificar el XML.

¿Como funciona un conversor a medida?

Antes de empezar a crear nuestros conversor a medida o custom converters debemos entender que es lo que realmente hace por detrás, el truco detrás de la magia, para ello deberemos una clase que implemente de la interfaz Converter sobreescribir los métodos que mencionaremos mas adelante y ademas registrar el conversor.

Una vez hecho eso y cuando se invoque a los métodos relacionados con la conversión a XML (toXML) o la conversión a objetos lo que hará es a medida que va chequeando cada uno de los nodos o atributos verificar su tipo y si coincide con alguno de los tipos de los conversores lo invocara pasandole el valor para que pueda ser modificado con algún formato en particular.

¿Como creo mi propio conversor?

Veamos por medio de un ejemplo como crear un conversor y registrarlo, para ello antes que nada definamos una clase (Invoice) que sera la que intentaremos cambiarle el formato al XML que se genera.

Una vez hecho esto deberemos crear nuestro conversor, en este caso lo que queremos hacer es cambiarle el formato al atributo date  para que en lugar de mostrarnos la fecha en un formato como este 20141111 18:02:28.223 ART no los muestre en uno mas amigable como este otro 11/11/2014. Para esto creemos primero un la clase DateConverter que implemente de Converter sobreescribiendo los métodos canConvert, marshal y unmarshal pero mejor veamos como quedaria el codigo del mismo:

Veamos ahora un poco en detalle cual es la idea detrás de cada función:

  • canConvert: la intención de este método es comprobar si cada uno de los atributos que se intenta escribir es del tipo Date para asi realizar o no la conversión del mismo.
  • marshal: este método se encarga de modificar el formato del dato y luego por medio de la instancia del HierarchicalStreamWriter escribirlo en el XML.
  • unmarshal: este método se encarga de realizar la operación contraria a marshal, o sea desde un XML transformar el atributo en el formato que este a un formato valido definido por nosotros.

Ahora bien tenemos el conversor pero debemos registrarlo para poder usarlo, para ello dentro de la instancia del objeto XStream deberemos invocar tantas veces como sea al metodo registerConverter. Veamos como quedaría el codigo:

Una vez que corramos este código nos retornara un String con un XML como el siguiente:

Como se ve el formato de la fecha cambio al formato que le hemos indicado al conversor, lo mismo pasaría si recibimos un XML como este y lo convertimos a objetos nos generaría un Date con esa fecha y con la hora todo en 00:00:00.

Para todo los que quieran probar con el proyecto que hemos armado a los fines de este post aqui se encuentra el código.

Conclusion

Como hemos visto, XStream nos brinda una gran facilidad de poder modificar nuestro XML de acuerdo a nuestras necesidades encapsulando esas modificaciones dentro de una clase la cual puede o no ser usada en todas las conversiones.

You may also like...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *