Содержание


Применение XStream для сериализации Java-объектов в XML

Узнайте, насколько легко осуществлять сохранение объектов в базе данных, конфигурирование и перенос информации при помощи XStream

Comments

Изменения от 23 июля 2008 г.: В раздел "Сериализация объектов" добавлена заметка "Использование псевдонимов".

XStream позволяет сериализовать большинство Java-объектов без всякого отображения. При этом имена элементов соответствуют именам объектов, а содержимое элементов – строковому представлению объектов. XStream способна сериализать объекты классов, не реализующих интерфейс Serializable. XStream представляет собой средство для сериализации объектов, а не связывания с данными, поэтому ее возможности не включают генерацию классов на основании документов XML или схем XML (XML Schema).

XStream обладает тремя свойствами, отличающими ее от любой другой библиотеки для сериализации.

  1. Видимость полей класса не играет роли в процессе сериализации/десериализации.
  2. Для сериализации/десериализации класса не требуется наличие get/set-методов для полей.
  3. Для сериализации/десериализации класса не требуется наличие конструктора по умолчанию.

Таким образом, XStream позволяет сериализовывать/десериализовывать любые классы, в том числе из сторонних библиотек, без необходимости их изменения.

Подготовка среды разработки

Выполните следующие действия для загрузки и установки XStream (ссылки для загрузки приведены в разделе Ресурсы):

  1. Загрузите среду Eclipse c Web-сайте Eclipse. Далее распакуйте архив в любую директорию (ниже она будет именоваться eclipse_home). В данной статье подразумевается, что вы работаете с Eclipse 3.3.
  2. Загрузите последнюю стабильную версию XStream с сайта проекта. Распакуйте архив в выбранную вами директорию (ниже она будет именоваться xstream_home). В данной статье подразумевается, что вы работаете с XStream 1.2.2.
  3. Загрузите комплект разработчика (SDK) для платформы Java Standard Edition (J2SE). Установите ее в директорию по вашему выбору (ниже она будет именоваться java_home). В данной статье подразумевается использование Java 1.5.0_05.

Создание Java-проекта

Чтобы создать новый Java-проект, раскройте меню File > New > Project и выполните следующие действия:

  1. Выберите пункт Java > Java Project > Next (рисунок 1).
    Рисунок 1. Создание нового Java-проекта
    Beginning a new Java project
    Beginning a new Java project
  2. Введите имя проекта и нажмите Next (рисунок 2).
    Рисунок 2. Ввод имени проекта
    Filling in the project name
    Filling in the project name
  3. Нажмите Finish для завершения создания проекта (рисунок 3).
    Рисунок 3. Завершение создания проекта
    Finalizing the setup
    Finalizing the setup

Созданный проект показан на рисунке 4.

Рисунок 4. Созданный Java-проект
A new Java project

Добавление XStream в проект

Выполните следующие действия для добавления библиотек XStream в созданный проект:

  1. Выберите проект в окне Project Explorer в Eclipse, а затем перейдите в меню Project и выберите пункт Properties (рисунок 5).
    Рисунок 5. Добавление библиотек XStream
    Adding XStream libraries
    Adding XStream libraries
  2. Нажмите на кнопку Add External JARs и выберите файл xstream-1.2.2.jar в каталоге xstream_home/lib.
  3. Нажмите OK для завершения (рисунок 6).
    Рисунок 6. Завершение добавления библиотек XStream
    Finalizing XStream support
    Finalizing XStream support

Результат добавления XStream в проект показан на рисунке 7.

Рисунок 7. Добавленные библиотеки
The added libraries

Сериализация объектов

Рассмотрим простой пример сериализации/десериализации объектов при помощи XStream. В данном примере используются два класса: Writer и Reader. Класс Writer использует API XStream для сериализации экземпляров класса Employee в XML, который затем сохраняется в виде файла на диске (листинг 1).

Листинг 1. Writer.java
package com.samples;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import com.thoughtworks.xstream.*;

public class Writer {

    public static void main(String[] args) {
        Employee e = new Employee();

        //Установка значений свойств через set-методы
        //Замечание: это также можно было сделать через конструктор
        //Однако, нашей целью является демонстрация того, что XStream
        //способна сериализовывать объекты без конструктора
        e.setName("Jack");
        e.setDesignation("Manager");
        e.setDepartment("Finance");

        //Объект-сериализатор
        XStream xs = new XStream();

        //Write to a file in the file system
        try {
            FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt");
            xs.toXML(e, fs);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }
    }
}

Класс Reader читает этот файл, разбирает XML и десериализует Java-объекты (листинг 2).

Листинг 2. Reader.java
package com.samples;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class Reader {

    public static void main(String[] args) {
        XStream xs = new XStream(new DomDriver());
        Employee e = new Employee();

        try {
            FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt");
            xs.fromXML(fis, e);

            Печать десериализованного объекта
            System.out.println(e.toString());

        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }

    }
}

Класс Employee приведен в листинге 3.

Листинг 3. Employee.java
package com.samples;

public class Employee {
    private String name;
    private String designation;
    private String department;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDesignation() {
        return designation;
    }
    public void setDesignation(String designation) {
        this.designation = designation;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    @Override
    public String toString() {
        return "Name : "+this.name+
        "\nDesignation : "+this.designation+
        "\nDepartment : "+this.department;
    }
}

Чтение конфигурационных файлов

Поведение многих приложений зависит от набора определенных параметров. В качестве таких параметров могут выступать имена источников данных, расположение журнального файла и т. д. Значения подобных параметров лучше всего хранить в конфигурационных файлах, поскольку это позволяет изменять их без перекомпиляции приложения, упрощая тем самым его сопровождение. Далее мы рассмотрим пример использования XStream для чтения конфигурационных свойств из файла XML.

Как правило, средства связывания с данными XML требуют генерации Java-объектов на основе файлов XML. При работе с XStream этого не требуется. Все, что необходимо – это создать класс на Java и связать его поля с именами элементов в XML. Далее допустим, что конфигурационные параметры хранятся в файле, обладающем структурой, показанной в листинге 4.

Листинг 4. Config.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <datasource-name>IRIS</datasource-name>
    <ipaddress>9.124.74.85</ipaddress>
    <logfilename>DailyLogApplication.log</logfilename>
    <appender>console</appender>
</config>

Код класса ConfigReader, который читает конфигурационный файл и загружает значения свойств внутрь объекта Java, приведен в листинге 5.

Листинг 5. ConfigReader.java
package com.samples;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomDriver;

public class ConfigReader {

    String datasourcename = null;
    String ipaddress = null;
    String logfilename = null;
    String appender = null;

    @Override
    public String toString() {
        // Этот метод печатает значения переменных-членов класса
        return "Datasource Name : "+datasourcename+
            " \nIP Address : "+ipaddress+
            " \nLogfilename : "+logfilename+
            " \nAppender : "+appender;
    }

    /**
     * @param args
     * @throws FileNotFoundException 
     */
    public static void main(String[] args) throws FileNotFoundException {
        XStream xs = new XStream(new DomDriver());

        FileInputStream fis = new FileInputStream("c:/temp/Config.xml");
        xs.aliasField("datasource-name", ConfigReader.class, "datasourcename");
        xs.alias("config", ConfigReader.class);
        ConfigReader r = (ConfigReader)xs.fromXML(fis);

        System.out.println(r.toString());
    }
}

Заключение

Создание приложения на основе XStream сводится к выполнению нескольких простых действий. Теперь, когда вы умеете использовать XStream для сериализации/десериализации Java-объектов и чтения конфигурационных файлов, можно переходить к изучению псевдонимов, аннотаций и конвертеров (все эти возможности описаны в руководствах на сайте XStream; ссылки приведены в разделе Ресурсы). Благодаря псевдонимам и конвертерам вы сможете получить полный контроль над структурой генерируемых документов XML.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Технология Java, Open source
ArticleID=433027
ArticleTitle=Применение XStream для сериализации Java-объектов в XML
publish-date=10052009