Skip to content

8 Serialización de Objetos a XML

Introducción

Para serializar de forma sencilla objetos Java a XML y viceversa, se suele usar la librería XStream.

Para usarla hay que descargarse los JAR desde el sitio web https://x-stream.github.io/

Se descomprime y se inserta al proyecto los JAR xstream-X.X.X.jar ubicada dentro de la carpeta lib. También será necesario el fichero kxml-X.X.X.jar que se localiza en la carpeta lib/xstream.

Otra manera de poder usar es a través de los gestores de paquetes Maven o Gradle, entre otros.

Escritura de ficheros XML

Para escribir un fichero XML usando la librería XStream, deberemos crear una clase que contenga una lista de los datos que queremos insertar, y después deberemos insertamos dicha lista en un XML usando la función toXML() que me permitirá parsear la lista a XML.

En está librería encontramos los siguientes métodos útiles:

  • alias(): Este método sirve para cambiar el nombre de la etiqueta de la clase en XML. Por ejemplo, si tenemos una clase ListProduct, la etiqueta XML por defecto será <ListProduct></ListProduct>, si queremos cambiar dicha etiqueta usaremos dicho método con el nombre de la etiqueta y la clase necesaria.
  • aliasField(): Es igual que el método anterior pero para los atributos de la clase.
  • addImplicitCollection(). Este método no añade la etiqueta del atributo de la lista que contiene la lista de objetos que queremos parsear.
public class ListaContactos {
    private final List<Person> list = new ArrayList<>();

    public ListaContactos() {}

    public List<Person> getList() {
        return list;
    }

    public void add(Person person){
        list.add(person);
    }
}
public class WriteXML {
    public void show() {
        XStream xStream = new XStream();
        ListaContactos listaContactos = new ListaContactos();
        File destino = new File("person.xml");

        listaContactos.add(new Person("María", 25));
        listaContactos.add(new Person("Julián", 33));

        try{
            xStream.alias("ListaPersonas", ListaContactos.class);
            xStream.alias("Contactos", Person.class);
            xStream.addImplicitCollection(ListaContactos.class, "list");
            xStream.aliasField("NombreContacto", Person.class, "name");
            xStream.aliasField("TeléfonoContacto", Person.class, "age");
            xStream.toXML(listaContactos, new FileOutputStream(destino));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new WriteXML().show();
    }
}

Lectura de ficheros XML

Para leer un fichero serializado XML con XStream será necesario volver a indicarle las alías, en caso de haberlo hecho.

¡Importante!

En algunas ocasiones para leer un fichero, será necesario darle permiso, por lo que usaremos la función addPermission()

public class ReadXML {
    public void show() {
        XStream xStream = new XStream();
        ListaContactos listaContactos;
        File file = new File("person.xml");

        try {
            xStream.addPermission(AnyTypePermission.ANY);
            xStream.alias("ListaPersonas", ListaContactos.class);
            xStream.alias("Contactos", Person.class);
            xStream.addImplicitCollection(ListaContactos.class, "list");
            xStream.aliasField("NombreContacto", Person.class, "name");
            xStream.aliasField("TeléfonoContacto", Person.class, "age");
            listaContactos = (ListaContactos) xStream.fromXML(new FileInputStream(file));
            for (Person person : listaContactos.getList()) {
                System.out.println(person);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new ReadXML().show();
    }
}