 | Уровень сложности: средний Раджив Бангалор, старший разработчик, 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 обладает тремя свойствами, отличающими ее от любой другой библиотеки для сериализации. - Видимость полей класса не играет роли в процессе сериализации/десериализации.
- Для сериализации/десериализации класса не требуется наличие get/set-методов для полей.
- Для сериализации/десериализации класса не требуется наличие конструктора по умолчанию.
Таким образом, XStream позволяет сериализовывать/десериализовывать любые классы, в том числе из сторонних библиотек, без необходимости их изменения.
Подготовка среды разработки
Выполните следующие действия для загрузки и установки XStream (ссылки для загрузки приведены в разделе Ресурсы):
- Загрузите среду Eclipse c Web-сайте Eclipse. Далее распакуйте архив в любую директорию (ниже она будет именоваться eclipse_home). В данной статье подразумевается, что вы работаете с Eclipse 3.3.
- Загрузите последнюю стабильную версию XStream с сайта проекта. Распакуйте архив в выбранную вами директорию (ниже она будет именоваться xstream_home). В данной статье подразумевается, что вы работаете с XStream 1.2.2.
- Загрузите комплект разработчика (SDK) для платформы Java Standard Edition (J2SE). Установите ее в директорию по вашему выбору (ниже она будет именоваться java_home). В данной статье подразумевается использование Java 1.5.0_05.
Создание Java-проекта
Чтобы создать новый Java-проект, раскройте меню File > New > Project и выполните следующие действия:
- Выберите пункт Java > Java Project > Next (рисунок 1).
Рисунок 1. Создание нового Java-проекта

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

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

Созданный проект показан на рисунке 4.
Рисунок 4. Созданный Java-проект
Добавление XStream в проект
Выполните следующие действия для добавления библиотек XStream в созданный проект:
- Выберите проект в окне Project Explorer в Eclipse, а затем перейдите в меню Project и выберите пункт Properties (рисунок 5).
Рисунок 5. Добавление библиотек XStream

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

Результат добавления XStream в проект показан на рисунке 7.
Рисунок 7. Добавленные библиотеки
Сериализация объектов
 |
Использование псевдонимов Имена элементов в сгенерированном 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.
Загрузка | Описание | Имя | Размер | Метод загрузки |
|---|
| Примеры исходного кода на Java | x-xstreamcode.zip | 3 KБ | HTTP |
|---|
Ресурсы Научиться
- Оригинал статьи: "Use XStream to serialize Java objects into XML". (EN)
- Прочитайте двухминутное руководство – отличное введение в XStream. Поверхностно ознакомившись с этим материалом, вы убедитесь в том, насколько просто трансформировать объекты в XML и обратно. (EN)
- Посетите страницу "Tweaking the Output", посвященную корректированию структуры выходного XML, на сайте XStream. (EN)
- Прочитайте руководство по написанию конвертеров, которые позволяют полностью управлять структурой генерируемых документов XML. (EN)
- Узнайте больше о связывании с данными, прочитав статью "Связывание с данными на практике: идем в ногу со временем" (Бретт Маклафлин, developerWorks, май 2004 г.). (EN)
- Прочитайте статью "Технологии XML и Java, связывание с данными, часть 1: кодогенерация – JAXB и не только" (Деннис Сосноски, developerWorks, январь 2003 г.), в которой описывается несколько подходов к связыванию с данными XML. (EN)
-
New to XML: на этом сайте содержится информация для новичков в XML.
-
Сертификация по XML корпорации IBM: узнайте, как стать сертифицированным разработчиком IBM в области XML и связанных с ним технологий. (EN)
- Обратитесь к технической библиотеке XML, содержащей множество статей, советов, руководств, стандартов и справочников IBM Redbook.
-
Технические мероприятия и Web-трансляции developerWorks: в этих разделах можно получить самую актуальную информацию о современных технологиях. (EN)
- Обратитесь к магазину технической литературы, в котором представлены книги на данную и другие темы. (EN)
-
Web-трансляции: слушайте интервью и обсуждения с участием технических экспертов IBM. (EN)
Получить продукты и технологии
-
Eclipse: установите Eclipse, загрузив его с официального сайта проекта. (EN)
- Загрузите XStream - простую библиотеку для сериализации/десериализации объектов в XML. (EN)
-
Ознакомительные версии продуктов IBM: используйте в вашем следующем проекте ознакомительные версии ПО, которые можно загрузить прямо с сайта IBM developerWorks. (EN)
Обсудить
Об авторе  | 
|  | Раджив Бангалор (Rajiv Bangalore) является главным разработчиком программного обеспечения в IBM India. За свою семилетнюю карьеру он участвовал в нескольких проектах по разработке ПО на платформе Java Enterprise Edition (Java EE). Связаться с ним можно по адресу rajiv.bangalore@in.ibm.com. |
Выскажите мнение об этой странице
|  |