XStream - Краткое руководство
XStream - это простая библиотека на основе Java для сериализации объектов Java в XML и наоборот.
Особенности
Easy to use - XStream API предоставляет высокоуровневый фасад для упрощения распространенных вариантов использования.
No need to create mapping - API XStream обеспечивает сопоставление по умолчанию для большинства сериализуемых объектов.
Performance - XStream работает быстро и занимает мало памяти, что подходит для больших графов объектов или систем.
Clean XML - XStream производит чистый и компактный XML-вывод, который легко читать.
Object modification not required- XStream сериализует внутренние поля, такие как закрытые и конечные поля, и поддерживает закрытые и внутренние классы. Конструктор по умолчанию не является обязательным требованием.
Full object graph support - XStream позволяет поддерживать повторяющиеся ссылки, встречающиеся в объектной модели, а также поддерживает циклические ссылки.
Customizable conversion strategies - Пользовательские стратегии могут быть зарегистрированы, чтобы разрешить настройку определенного типа для представления в виде XML.
Security framework - XStream обеспечивает беспрепятственный контроль над немаршалированными типами для предотвращения проблем безопасности с управляемым вводом.
Error messages - Когда возникает исключение из-за неправильного формата XML, оно предоставляет подробную диагностику для устранения проблемы.
Alternative output format - XStream поддерживает другие форматы вывода, такие как JSON и морфинг.
Обычное использование
Transport - XML - это текстовое представление объекта, которое может использоваться для передачи объектов по сети независимо от используемых методов сериализации / десериализации.
Persistence - Объекты могут сохраняться как XML в базах данных и могут быть упорядочены / демаршалированы по мере необходимости.
Configuration- XML не требует пояснений и широко используется для определения конфигураций. Объекты также можно использовать для целей конфигурации после преобразования их в представление XML.
Unit Tests - XStream API совместим с JUnit и может использоваться для улучшения модульного тестирования модулей приложения.
В этой главе мы обсудим различные аспекты создания благоприятной среды для Java.
Настройка локальной среды
Если вы хотите настроить среду для языка программирования Java, в этом разделе объясняется, как загрузить и установить Java на свой компьютер. Пожалуйста, следуйте инструкциям ниже, чтобы настроить среду Java.
Java SE можно скачать бесплатно по ссылке -
Скачайте Java .
Следуйте инструкциям, чтобы загрузить Java и запустить .exeчтобы установить Java на свой компьютер. После того, как вы установили Java на свой компьютер, вам нужно будет установить переменные среды, чтобы они указывали на правильные каталоги установки -
Настройка пути для Windows 2000 / XP
Предполагая, что вы установили Java в каталог c: \ Program Files \ java \ jdk -
Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства».
Нажмите кнопку «Переменные среды» на вкладке «Дополнительно».
Измените переменную «Путь», чтобы она также содержала путь к исполняемому файлу 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'
Настройка пути для Linux, UNIX, Solaris, FreeBSD
Переменная среды PATH должна указывать на место установки двоичных файлов Java. Обратитесь к документации по оболочке, если у вас возникли проблемы с этим.
Например, если вы используете bash в качестве оболочки, вы должны добавить следующую строку в конец вашего .bashrc: export PATH = / path / to / java: $ PATH '
Популярные редакторы Java
Для написания программ на Java вам понадобится текстовый редактор. На рынке доступны даже более сложные IDE. Но пока вы можете рассмотреть одно из следующих:
Notepad - В Windows вы можете использовать любой простой текстовый редактор, например Блокнот (рекомендуется для этого урока) или TextPad.
Netbeans - Это бесплатная Java IDE, которую можно загрузить с https://www.netbeans.org/index.html.
Eclipse - Это также Java IDE, разработанная сообществом разработчиков открытого исходного кода eclipse, которую можно загрузить с https://www.eclipse.org/.
Скачать архив XStream
Загрузите последнюю версию файла jar XStream из xstream-1.4.7.jar. На момент написания этого руководства мы загрузили xstream-1.4.7.jar и скопировали его в папку C: \> XStream.
Операционные системы | Имя архива |
---|---|
Windows | xstream-1.4.7.jar |
Linux | xstream-1.4.7.jar |
Mac | xstream-1.4.7.jar |
Установить среду XStream
Установить XStream_HOMEпеременная среды, указывающая на расположение базового каталога, в котором на вашем компьютере хранится xstream jar. В следующей таблице показано, как установить среду XStream в Windows, Linux и Mac, предполагая, что мы извлекли xstream-1.4.7.jar в папку XStream.
Sr.No. | ОС и описание |
---|---|
1 | Windows Установите для переменной среды XStream_HOME значение C: \ XStream |
2 | Linux экспорт XStream_HOME = / usr / local / XStream |
3 | Mac экспорт 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 экспорт CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
3 | Mac экспорт CLASSPATH = $ CLASSPATH: $ XStream_HOME / xstream-1.4.7.jar; |
Прежде чем вдаваться в подробности библиотеки XStream, давайте посмотрим на приложение в действии. В этом примере мы создали классы Student и Address. Мы создадим объект ученика, а затем сериализуем его в строку XML. Затем десериализуйте ту же строку XML, чтобы получить обратно объект ученика.
Создайте файл класса Java с именем XStreamTester в C: \> XStream_WORKSPACE.
File: 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();
}
}
Verify the Result
Скомпилируйте классы, используя javac компилятор следующим образом -
C:\XStream_WORKSPACE>javac XStreamTester.java
Теперь запустите XStreamTester, чтобы увидеть результат -
C:\XStream_WORKSPACE>java XStreamTester
Verify the output as follows
<?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);
Псевдонимы - это метод настройки сгенерированного 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.
File: 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;
}
}
Verify the Result
Скомпилируйте классы, используя 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.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, которые отвечают за преобразование объекта в 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.
File: 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;
}
}
Verify the Result
Скомпилируйте классы, используя 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.
File: 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);
}
}
Verify the Result
Скомпилируйте классы, используя 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 предоставляет альтернативные реализации 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 в настоящее время поддерживает 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
Проверьте вывод следующим образом -
{
"firstName": "Mahesh",
"lastName": "Parashar"
}