Учебники

XStream — Краткое руководство

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 .

Следуйте инструкциям для загрузки 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 полностью определено. Чтобы заменить его как тег студента, следуйте следующему разделу.

Class Aliasing

Field Aliasing

Неявное наложение коллекций

Псевдоним атрибута

Пакет Aliasing

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

Проверьте вывод следующим образом —