XStream — Обзор
XStream — это простая библиотека на основе Java для сериализации объектов Java в XML и наоборот.
Характеристики
-
Простота использования — API-интерфейс XStream обеспечивает высокоуровневый фасад для упрощения общих случаев использования.
-
Нет необходимости создавать сопоставление — API-интерфейс XStream обеспечивает сопоставление по умолчанию для большинства сериализуемых объектов.
-
Производительность — XStream работает быстро и занимает мало памяти, что подходит для больших графов объектов или систем.
-
Чистый XML — XStream производит чистый и компактный вывод XML, который легко читать.
-
Модификация объекта не требуется — XStream сериализует внутренние поля, такие как закрытые и конечные поля, и поддерживает закрытые и внутренние классы. Конструктор по умолчанию не является обязательным требованием.
-
Полная поддержка графов объектов — XStream позволяет поддерживать дубликаты ссылок, встречающихся в объектной модели, а также поддерживает циклические ссылки.
-
Настраиваемые стратегии преобразования. Пользовательские стратегии могут быть зарегистрированы, чтобы можно было представить настройку определенного типа в виде XML.
-
Инфраструктура безопасности — XStream обеспечивает справедливый контроль над недешевыми типами для предотвращения проблем безопасности с помощью манипулируемого ввода.
-
Сообщения об ошибках — когда возникает исключение из-за неверно сформированного XML, он предоставляет подробную диагностику для устранения проблемы.
-
Альтернативный формат вывода — XStream поддерживает другие форматы вывода, такие как JSON и морфинг.
Простота использования — API-интерфейс XStream обеспечивает высокоуровневый фасад для упрощения общих случаев использования.
Нет необходимости создавать сопоставление — API-интерфейс XStream обеспечивает сопоставление по умолчанию для большинства сериализуемых объектов.
Производительность — XStream работает быстро и занимает мало памяти, что подходит для больших графов объектов или систем.
Чистый XML — XStream производит чистый и компактный вывод XML, который легко читать.
Модификация объекта не требуется — XStream сериализует внутренние поля, такие как закрытые и конечные поля, и поддерживает закрытые и внутренние классы. Конструктор по умолчанию не является обязательным требованием.
Полная поддержка графов объектов — XStream позволяет поддерживать дубликаты ссылок, встречающихся в объектной модели, а также поддерживает циклические ссылки.
Настраиваемые стратегии преобразования. Пользовательские стратегии могут быть зарегистрированы, чтобы можно было представить настройку определенного типа в виде XML.
Инфраструктура безопасности — XStream обеспечивает справедливый контроль над недешевыми типами для предотвращения проблем безопасности с помощью манипулируемого ввода.
Сообщения об ошибках — когда возникает исключение из-за неверно сформированного XML, он предоставляет подробную диагностику для устранения проблемы.
Альтернативный формат вывода — XStream поддерживает другие форматы вывода, такие как JSON и морфинг.
Общее использование
-
Транспорт — XML представляет собой текстовое представление объекта и может использоваться для передачи объектов по проводам независимо от используемых методов сериализации / десериализации.
-
Постоянство — объекты могут быть сохранены в виде XML в базах данных и могут быть упорядочены / распакованы по мере необходимости.
-
Конфигурация — XML не требует пояснений и широко используется для определения конфигураций. Объекты также можно использовать для целей конфигурации после преобразования их в представление XML.
-
Модульные тесты — API-интерфейс XStream совместим с JUnit и может использоваться для улучшения модульного тестирования модулей приложения.
Транспорт — XML представляет собой текстовое представление объекта и может использоваться для передачи объектов по проводам независимо от используемых методов сериализации / десериализации.
Постоянство — объекты могут быть сохранены в виде XML в базах данных и могут быть упорядочены / распакованы по мере необходимости.
Конфигурация — XML не требует пояснений и широко используется для определения конфигураций. Объекты также можно использовать для целей конфигурации после преобразования их в представление XML.
Модульные тесты — API-интерфейс XStream совместим с JUnit и может использоваться для улучшения модульного тестирования модулей приложения.
XStream — Настройка среды
В этой главе мы обсудим различные аспекты настройки благоприятной среды для Java.
Настройка локальной среды
Если вы хотите настроить свою среду для языка программирования Java, то в этом разделе объясняется, как загрузить и настроить Java на вашем компьютере. Пожалуйста, следуйте инструкциям ниже, чтобы настроить вашу среду Java.
Java SE можно скачать бесплатно по ссылке —
Следуйте инструкциям для загрузки Java и запуска .exe для установки Java на вашем компьютере. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные среды, чтобы они указывали на правильные каталоги установки —
Настройка пути для Windows 2000 / XP
Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk —
-
Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».
-
Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».
-
Измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».
Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».
Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».
Измените переменную Path, чтобы она также содержала путь к исполняемому файлу Java. Например, если в настоящий момент путь задан как «C: \ WINDOWS \ SYSTEM32», измените ваш путь на «C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin».
Настройка пути для Windows 95/98 / ME
Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk —
-
Отредактируйте файл ‘C: \ autoexec.bat’ и добавьте следующую строку в конце:
‘SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin’
Отредактируйте файл ‘C: \ autoexec.bat’ и добавьте следующую строку в конце:
‘SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin’
Настройка пути для Linux, UNIX, Solaris, FreeBSD
Переменная среды PATH должна указывать на то, где установлены двоичные файлы Java. Обратитесь к документации по вашей оболочке, если у вас возникли проблемы с этим.
Например, если вы используете bash в качестве оболочки, то вы добавили бы следующую строку в конец вашего .bashrc: export PATH = / path / to / java: $ PATH ‘
Популярные редакторы Java
Для написания программ на Java вам понадобится текстовый редактор. На рынке доступны еще более сложные IDE. Но сейчас вы можете рассмотреть один из следующих —
-
Блокнот — В Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого урока) или TextPad.
-
Netbeans — это Java IDE, которая бесплатна и может быть загружена с https://www.netbeans.org/index.html .
-
Eclipse — это также Java IDE, разработанная сообществом открытого исходного кода eclipse, которую можно скачать по адресу https://www.eclipse.org/ .
Блокнот — В Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого урока) или TextPad.
Netbeans — это Java IDE, которая бесплатна и может быть загружена с https://www.netbeans.org/index.html .
Eclipse — это также Java IDE, разработанная сообществом открытого исходного кода eclipse, которую можно скачать по адресу https://www.eclipse.org/ .
Скачать архив XStream
Загрузите последнюю версию файла XStream jar с XSTREAM-1.4.7.jar. На момент написания этого руководства мы загрузили xstream-1.4.7.jar и скопировали его в папку C: \> XStream.
| Операционные системы | Название архива |
|---|---|
| Windows | XStream-1.4.7.jar |
| Linux | XStream-1.4.7.jar |
| макинтош | XStream-1.4.7.jar |
Установить среду XStream
Задайте переменную среды XStream_HOME, чтобы она указывала на местоположение базовой директории, где на вашем компьютере хранится jstream jar. В следующей таблице показано, как настроить среду XStream в Windows, Linux и Mac, при условии, что мы извлекли xstream-1.4.7.jar в папку XStream.
| Sr.No. | ОС и описание |
|---|---|
| 1 |
Windows Установите переменную окружения XStream_HOME в C: \ XStream |
| 2 |
Linux export XStream_HOME = / usr / local / XStream |
| 3 |
макинтош export XStream_HOME = / Библиотека / XStream |
Windows
Установите переменную окружения XStream_HOME в C: \ XStream
Linux
export XStream_HOME = / usr / local / XStream
макинтош
export XStream_HOME = / Библиотека / XStream
Установить переменную CLASSPATH
Задайте переменную среды CLASSPATH, чтобы она указывала на расположение фляги XStream. В следующей таблице показано, как установить переменную CLASSPATH в системах Windows, Linux и Mac, при условии, что мы сохранили xstream-1.4.7.jar в папке XStream.
| Sr.No. | ОС и описание |
|---|---|
| 1 |
Windows Задайте для переменной среды CLASSPATH значение% CLASSPATH%;% XStream_HOME% \ xstream-1.4.7.jar; |
| 2 |
Linux export CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
| 3 |
макинтош export CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
Windows
Задайте для переменной среды CLASSPATH значение% CLASSPATH%;% XStream_HOME% \ xstream-1.4.7.jar;
Linux
export CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar;
макинтош
export CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar;
XStream — первое приложение
Прежде чем углубляться в детали библиотеки XStream, давайте посмотрим на приложение в действии. В этом примере мы создали классы Student и Address. Мы создадим объект студента и затем сериализуем его в строку XML. Затем удалите сериализацию той же строки XML, чтобы получить объект ученика обратно.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE.
Файл: XStreamTester.java
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.sax.SAXSource; import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.stream.StreamResult; import org.xml.sax.InputSource; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.StaxDriver; public class XStreamTester { public static void main(String args[]) { XStreamTester tester = new XStreamTester(); XStream xstream = new XStream(new StaxDriver()); Student student = tester.getStudentDetails(); //Object to XML Conversion String xml = xstream.toXML(student); System.out.println(formatXml(xml)); //XML to Object Conversion Student student1 = (Student)xstream.fromXML(xml); System.out.println(student1); } private Student getStudentDetails() { Student student = new Student(); student.setFirstName("Mahesh"); student.setLastName("Parashar"); student.setRollNo(1); student.setClassName("1st"); Address address = new Address(); address.setArea("H.No. 16/3, Preet Vihar."); address.setCity("Delhi"); address.setState("Delhi"); address.setCountry("India"); address.setPincode(110012); student.setAddress(address); return student; } public static String formatXml(String xml) { try { Transformer serializer = SAXTransformerFactory.newInstance().newTransformer(); serializer.setOutputProperty(OutputKeys.INDENT, "yes"); serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); Source xmlSource = new SAXSource(new InputSource( new ByteArrayInputStream(xml.getBytes()))); StreamResult res = new StreamResult(new ByteArrayOutputStream()); serializer.transform(xmlSource, res); return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray()); } catch(Exception e) { return xml; } } } class Student { private int rollNo; private String firstName; private String lastName; private String className; private Address address; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public int getRollNo() { return rollNo; } public void setRollNo(int rollNo) { this.rollNo = rollNo; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("Student [ "); stringBuilder.append("\nfirstName: "); stringBuilder.append(firstName); stringBuilder.append("\nlastName: "); stringBuilder.append(lastName); stringBuilder.append("\nrollNo: "); stringBuilder.append(rollNo); stringBuilder.append("\nclassName: "); stringBuilder.append(className); stringBuilder.append("\naddress: "); stringBuilder.append(address); stringBuilder.append(" ]"); return stringBuilder.toString(); } } class Address { private String area; private String city; private String state; private String country; private int pincode; public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getState() { return state; } public void setState(String state) { this.state = state; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } public int getPincode() { return pincode; } public void setPincode(int pincode) { this.pincode = pincode; } public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("\nAddress [ "); stringBuilder.append("\narea: "); stringBuilder.append(area); stringBuilder.append("\ncity: "); stringBuilder.append(city); stringBuilder.append("\nstate: "); stringBuilder.append(state); stringBuilder.append("\ncountry: "); stringBuilder.append(country); stringBuilder.append("\npincode: "); stringBuilder.append(pincode); stringBuilder.append(" ]"); return stringBuilder.toString(); } }
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE>java XStreamTester
Проверьте вывод следующим образом
<?xml version = "1.0" encoding = "UTF-8"?>
<Student>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
<rollNo>1</rollNo>
<className>1st</className>
<address>
<area>H.No. 16/3, Preet Vihar.</area>
<city>Delhi</city>
<state>Delhi</state>
<country>India</country>
<pincode>110012</pincode>
</address>
</Student>
Student [
firstName: Mahesh
lastName: Parashar
rollNo: 1
className: 1st
address:
Address [
area: H.No. 16/3, Preet Vihar.
city: Delhi
state: Delhi
country: India
pincode: 110012
]
]
Шаги, чтобы Помнить
Ниже приведены важные шаги, которые следует рассмотреть здесь.
Шаг 1. Создание объекта XStream.
Создайте объект XStream, передав ему StaxDriver. StaxDriver использует синтаксический анализатор Stax (доступен с Java 6) и является быстрым парсером XML.
XStream xstream = new XStream(new StaxDriver());
Шаг 2: Сериализация объекта в XML
Используйте метод toXML () для получения строкового представления объекта в формате XML.
//Object to XML Conversion String xml = xstream.toXML(student);
Шаг 3: Сериализация XML для получения объекта
Используйте метод fromXML (), чтобы получить объект из XML.
//XML to Object Conversion Student student1 = (Student)xstream.fromXML(xml);
XStream — Псевдоним
Псевдоним — это метод настройки сгенерированного XML или использования определенного отформатированного XML с использованием XStream. Давайте предположим, что следующий формат XML должен использоваться для сериализации / десериализации объекта Student.
<student name = "Suresh"> <note> <title>first</title> <description>My first assignment.</description> </note> <note> <title>second</title> <description>My second assignment.</description> </note> </student>
На основе приведенного выше формата XML давайте создадим классы моделей.
class Student {
private String studentName;
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
}
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Давайте проверим сериализацию вышеуказанных объектов с использованием XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh");
student.addNote(new Note("first","My first assignment."));
student.addNote(new Note("second","My Second assignment."));
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
class Student {
private String studentName;
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
}
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?>
<com.tutorialspoint.xstream.Student>
<studentName>Mahesh</studentName>
<notes>
<com.tutorialspoint.xstream.Note>
<title>first</title>
<description>My first assignment.</description>
</com.tutorialspoint.xstream.Note>
<com.tutorialspoint.xstream.Note>
<title>second</title>
<description>My Second assignment.</description>
</com.tutorialspoint.xstream.Note>
</notes>
</com.tutorialspoint.xstream.Student>
В результате, приведенном выше, имя объекта Student полностью определено. Чтобы заменить его как тег студента, следуйте следующему разделу.
XStream — Аннотации
XStream поддерживает аннотации аналогично автоматической настройке вместо кодирования. В предыдущей главе мы видели следующие конфигурации в коде.
xstream.alias("student", Student.class);
xstream.alias("note", Note.class);
xstream.useAttributeFor(Student.class, "studentName");
xstream.aliasField("name", Student.class, "studentName");
xstream.addImplicitCollection(Student.class, "notes");
Следующий фрагмент кода иллюстрирует использование аннотаций для выполнения той же работы гораздо более простым способом.
@XStreamAlias("student") //define class level alias
class Student {
@XStreamAlias("name") //define field level alias
@XStreamAsAttribute //define field as attribute
private String studentName;
@XStreamImplicit //define list as an implicit collection
private List<Note> notes = new ArrayList<Note>();
@XStreamOmitField //omit a field to not to be a part of XML
private int type;
}
Давайте проверим вышеупомянутую аннотацию, используя XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.processAnnotations(Student.class);
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh");
student.addNote(new Note("first","My first assignment."));
student.addNote(new Note("second","My Second assignment."));
student.setType(1);
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private String studentName;
@XStreamImplicit
private List<Note> notes = new ArrayList<Note>();
public Student(String name) {
this.studentName = name;
}
public void addNote(Note note) {
notes.add(note);
}
public String getName() {
return studentName;
}
public List<Note> getNotes() {
return notes;
}
@XStreamOmitField
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
@XStreamAlias("note")
class Note {
private String title;
private String description;
public Note(String title, String description) {
this.title = title;
this.description = description;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?>
<student name = "Mahesh">
<note>
<title>first</title>
<description>My first assignment.</description>
</note>
<note>
<title>second</title>
<description>My Second assignment.</description>
</note>
</student>
Чтобы указать платформе XStream обрабатывать аннотации, вам нужно добавить следующую команду перед сериализацией xml.
xstream.processAnnotations(Student.class);
Или же
xstream.autodetectAnnotations(true);
XStream — Конвертеры
Преобразователи XStream являются ключевыми компонентами библиотеки XStream, которые отвечают за преобразование объекта в XML и наоборот. XStream предоставляет многочисленные конвертеры для распространенных типов, таких как примитивы, строки, файлы, коллекции, массивы и даты.
Использование конвертера
Давайте используем SingleValueConvertor, целью которого является преобразование объекта в одну строку. Мы будем использовать SingleValueConvertor для записи объекта в виде строки атрибута.
Создать конвертер
class NameConverter implements SingleValueConverter {
public Object fromString(String name) {
String[] nameparts = name.split(",");
return new Name(nameparts[0], nameparts[1]);
}
public String toString(Object name) {
return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
}
public boolean canConvert(Class type) {
return type.equals(Name.class);
}
}
Зарегистрировать конвертер
xstream.registerConverter(new NameConverter());
Пример без конвертера
Давайте сначала проверим код без конвертера в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.autodetectAnnotations(true);
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh","Parashar");
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private Name studentName;
public Student(String firstName, String lastName) {
this.studentName = new Name(firstName, lastName);
}
public Name getName() {
return studentName;
}
}
class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
Пример с конвертером
Теперь давайте проверим код с конвертером в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.converters.SingleValueConverter;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
Student student = tester.getStudentDetails();
xstream.autodetectAnnotations(true);
xstream.registerConverter(new NameConverter());
//Object to XML Conversion
String xml = xstream.toXML(student);
System.out.println(formatXml(xml));
}
private Student getStudentDetails() {
Student student = new Student("Mahesh","Parashar");
return student;
}
public static String formatXml(String xml) {
try {
Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
Source xmlSource = new SAXSource(new InputSource(
new ByteArrayInputStream(xml.getBytes())));
StreamResult res = new StreamResult(new ByteArrayOutputStream());
serializer.transform(xmlSource, res);
return new String(((ByteArrayOutputStream)res.getOutputStream()).toByteArray());
} catch(Exception e) {
return xml;
}
}
}
@XStreamAlias("student")
class Student {
@XStreamAlias("name")
@XStreamAsAttribute
private Name studentName;
public Student(String firstName, String lastName) {
this.studentName = new Name(firstName, lastName);
}
public Name getName() {
return studentName;
}
}
class Name {
private String firstName;
private String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
class NameConverter implements SingleValueConverter {
public Object fromString(String name) {
String[] nameparts = name.split(",");
return new Name(nameparts[0], nameparts[1]);
}
public String toString(Object name) {
return ((Name)name).getFirstName() + "," + ((Name)name).getLastName();
}
public boolean canConvert(Class type) {
return type.equals(Name.class);
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
<?xml version = "1.0" encoding = "UTF-8"?> <student name = "Mahesh,Parashar"/>
XStream — Потоки объектов
XStream предоставляет альтернативные реализации java.io.ObjectInputStream и java.io.ObjectOutputStream, так что потоки объектов могут быть сериализованы или десериализованы из XML. Это особенно полезно, когда нужно обрабатывать большие наборы объектов, сохраняя один объект в памяти за раз.
Синтаксис: createObjectOutputStream ()
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
Синтаксис: createObjectInputStream ()
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
Давайте теперь протестируем код с потоками объектов в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.xml.StaxDriver;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new StaxDriver());
xstream.autodetectAnnotations(true);
Student student1 = new Student("Mahesh","Parashar");
Student student2 = new Student("Suresh","Kalra");
Student student3 = new Student("Ramesh","Kumar");
Student student4 = new Student("Naresh","Sharma");
try {
ObjectOutputStream objectOutputStream = xstream.createObjectOutputStream(
new FileOutputStream("test.txt"));
objectOutputStream.writeObject(student1);
objectOutputStream.writeObject(student2);
objectOutputStream.writeObject(student3);
objectOutputStream.writeObject(student4);
objectOutputStream.writeObject("Hello World");
objectOutputStream.close();
ObjectInputStream objectInputStream = xstream.createObjectInputStream(
new FileInputStream("test.txt"));
Student student5 = (Student)objectInputStream.readObject();
Student student6 = (Student)objectInputStream.readObject();
Student student7 = (Student)objectInputStream.readObject();
Student student8 = (Student)objectInputStream.readObject();
String text = (String)objectInputStream.readObject();
System.out.println(student5);
System.out.println(student6);
System.out.println(student7);
System.out.println(student8);
System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@XStreamAlias("student")
class Student {
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String toString() {
return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —
Student [ firstName: Mahesh, lastName: Parashar ] Student [ firstName: Suresh, lastName: Kalra ] Student [ firstName: Ramesh, lastName: Kumar ] Student [ firstName: Naresh, lastName: Sharma ] Hello World
Посмотрите на содержимое test.txt, находящегося в папке C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
<?xml version = "1.0" ?>
<object-stream>
<student>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</student>
<student>
<firstName>Suresh</firstName>
<lastName>Kalra</lastName>
</student>
<student>
<firstName>Ramesh</firstName>
<lastName>Kumar</lastName>
</student>
<student>
<firstName>Naresh</firstName>
<lastName>Sharma</lastName>
</student>
<string>Hello World</string>
</object-stream>
XStream — Написание JSON с использованием XStream
XStream поддерживает JSON, инициализируя объект XStream соответствующим драйвером. В настоящее время XStream поддерживает JettisonMappedXmlDriver и JsonHierarchicalStreamDriver.
Давайте теперь протестируем код с обработкой json в XStream.
Создайте файл Java-класса с именем XStreamTester в C: \> XStream_WORKSPACE \ com \ tutorialspoint \ xstream.
Файл: XStreamTester.java
package com.tutorialspoint.xstream;
import java.io.Writer;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
public class XStreamTester {
public static void main(String args[]) {
XStreamTester tester = new XStreamTester();
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
Student student = new Student("Mahesh","Parashar");
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("student", Student.class);
System.out.println(xstream.toXML(student));
}
}
@XStreamAlias("student")
class Student {
private String firstName;
private String lastName;
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String toString() {
return "Student [ firstName: "+firstName+", lastName: "+ lastName+ " ]";
}
}
Проверьте результат
Скомпилируйте классы, используя компилятор javac следующим образом:
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат —
C:\XStream_WORKSPACE\com\tutorialspoint\xstream>java XStreamTester
Проверьте вывод следующим образом —