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
Проверьте вывод следующим образом —