IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML | Технология Java | Open source  >

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

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

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Раджив Бангалор, старший разработчик, IBM India Private Ltd.

05.10.2009

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

Изменения от 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

  2. Введите имя проекта и нажмите Next (рисунок 2).

    Рисунок 2. Ввод имени проекта
    Filling in the project name

  3. Нажмите Finish для завершения создания проекта (рисунок 3).

    Рисунок 3. Завершение создания проекта
    Finalizing the setup

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


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

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

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

  1. Выберите проект в окне Project Explorer в Eclipse, а затем перейдите в меню Project и выберите пункт Properties (рисунок 5).

    Рисунок 5. Добавление библиотек XStream
    Adding XStream libraries

  2. Нажмите на кнопку Add External JARs и выберите файл xstream-1.2.2.jar в каталоге xstream_home/lib.
  3. Нажмите OK для завершения (рисунок 6).

    Рисунок 6. Завершение добавления библиотек XStream
    Finalizing XStream support

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


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


В начало


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

Использование псевдонимов
Имена элементов в сгенерированном XML, например <com.samples.Writer>, соответствуют полным именам классов. Если вы хотите, чтобы в качестве имен элементов выступали краткие имена классов (без имен пакетов), то следует использовать псевдонимы (XStream Aliases). Руководство по работе с псевдонимами можно найти на сайте XStream.

Рассмотрим простой пример сериализации/десериализации объектов при помощи 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;
    }
}



В начало


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

Чтение XML-файлов со сложной структурой
В данном примере иллюстрируется чтение простого документа XML. Если вам необходимо работать с файлами, обладающими сложной структурой, то, возможно, придется создать собственный класс-конвертер. Информацию на эту тему можно найти в руководство по написанию конвертеров на сайте XStream (см. Ресурсы).

Поведение многих приложений зависит от набора определенных параметров. В качестве таких параметров могут выступать имена источников данных, расположение журнального файла и т. д. Значения подобных параметров лучше всего хранить в конфигурационных файлах, поскольку это позволяет изменять их без перекомпиляции приложения, упрощая тем самым его сопровождение. Далее мы рассмотрим пример использования 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.




В начало


Загрузка

ОписаниеИмяРазмерМетод загрузки
Примеры исходного кода на Javax-xstreamcode.zip3 KБHTTP
Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии
  • Eclipse: установите Eclipse, загрузив его с официального сайта проекта. (EN)

  • Загрузите XStream - простую библиотеку для сериализации/десериализации объектов в XML. (EN)

  • Ознакомительные версии продуктов IBM: используйте в вашем следующем проекте ознакомительные версии ПО, которые можно загрузить прямо с сайта IBM developerWorks. (EN)


Обсудить


Об авторе

Photo of Rajiv Bangalore

Раджив Бангалор (Rajiv Bangalore) является главным разработчиком программного обеспечения в IBM India. За свою семилетнюю карьеру он участвовал в нескольких проектах по разработке ПО на платформе Java Enterprise Edition (Java EE). Связаться с ним можно по адресу rajiv.bangalore@in.ibm.com.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



 


 


 


Поделиться этой статьей:

забобрить забобрить memori сохранить в memori




В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.
    IBM в России Конфиденциальность Контакты