Руководство Java XStream
1. Что такое XStream?
XStream это Java библиотека классов, используется для сериализации Java объектов в XML формат и обратно.
2. Библиотека XStream
Вы можете скачать XStream по ссылке:
Или добавить использование библиотеки XStream для Maven:
<!-- http://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.8</version>
</dependency>
3. Некоторые классы, участвующие в примере.
Address.java
package org.o7planning.xstreamtutorial.beans;
public class Address {
private String street;
private String city;
public Address() {
}
public Address(String street, String city) {
this.street = street;
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return street + ", " + city;
}
}
Company.java
package org.o7planning.xstreamtutorial.beans;
public class Company {
private int id;
private String name;
private String[] websites;
private Address address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getWebsites() {
return websites;
}
public void setWebsites(String[] websites) {
this.websites = websites;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("\n id:" + this.id);
sb.append("\n name:" + this.name);
if (this.websites != null) {
sb.append("\n website: ");
for (String website : this.websites) {
sb.append(website + ", ");
}
}
if (this.address != null) {
sb.append("\n address:" + this.address.toString());
}
return sb.toString();
}
}
DataDAO.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Address;
import org.o7planning.xstreamtutorial.beans.Company;
public class DataDAO {
public static Company createCompany() {
Company company = new Company();
company.setId(111);
company.setName("Microsoft");
String[] websites = { "http://microsoft.com",
"http://msn.com", "http://hotmail.com" };
company.setWebsites(websites);
Address address = new Address();
address.setCity("Redmond");
address.setStreet("1 Microsoft Way");
company.setAddress(address);
return company;
}
}
4. Изменить объект Java в XML
В отличии от JAXB, XStream может сериализовать Java в XML без маппинга (mapping), используется маппинг по умолчанию. Посмотрим следующий пример:
JavaObject2Xml.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class JavaObject2Xml {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xs = new XStream();
// JAVA OBJECT --> XML
String xml = xs.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<org.o7planning.xstreamtutorial.beans.Company>
<id>111</id>
<name>Microsoft</name>
<websites>
<string>http://microsoft.com</string>
<string>http://msn.com</string>
<string>http://hotmail.com</string>
</websites>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</org.o7planning.xstreamtutorial.beans.Company>
5. Использовать Alias (Псевдоним)
При конвертации Java в XML, по умолчанию XStream серилизует класс в формат XML. Алиасинг (Aliasing) техника настройки созданного XML. Существует 5 видов алиаснга:
- Класс Алиаснг (class)
- Алиасинг поля (field)
- Неявные коллекции Алиасинг
- Атрибут Алиасинг
- Пакет Алиасинг
Псевдоним class
ClassAliasingExample.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class ClassAliasingExample {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xs = new XStream();
xs.alias("company", Company.class);
// JAVA OBJECT --> XML
String xml = xs.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<company>
<id>111</id>
<name>Microsoft</name>
<websites>
<string>http://microsoft.com</string>
<string>http://msn.com</string>
<string>http://hotmail.com</string>
</websites>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</company
Псевдоним поля (field)
FieldAliasingExample.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class FieldAliasingExample {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xstream = new XStream();
// Class aliasing.
xstream.alias("company", Company.class);
// Field aliasing.
// aliasField(String alias, Class definedIn, String fieldName).
xstream.aliasField("companyName", Company.class, "name");
xstream.aliasField("companyId", Company.class, "id");
// JAVA OBJECT --> XML
String xml = xstream.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<company>
<companyId>111</companyId>
<companyName>Microsoft</companyName>
<websites>
<string>http://microsoft.com</string>
<string>http://msn.com</string>
<string>http://hotmail.com</string>
</websites>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</company>
Набор неявных псевдонимов
Обычно подмножество (Подмножество/Коллекция) в Java при переходе в XML заключен в карту. Вы можете использовать Атрибут алиасинг для подмножества чтобы избавиться от карты.
ImplicitCollectionsAliasingExample.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class ImplicitCollectionsAliasingExample {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xstream = new XStream();
// Class aliasing.
xstream.alias("company", Company.class);
// addImplicitArray(Class ownerType, String fieldName).
xstream.addImplicitArray(Company.class, "websites", "website");
// JAVA OBJECT --> XML
String xml = xstream.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<company>
<id>111</id>
<name>Microsoft</name>
<website>http://microsoft.com</website>
<website>http://msn.com</website>
<website>http://hotmail.com</website>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</company>
Псевдоним атрибута
AttributeAliasingExample.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class AttributeAliasingExample {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xstream = new XStream();
// Class aliasing.
xstream.alias("company", Company.class);
// useAttributeFor(Class definedIn, String fieldName).
xstream.useAttributeFor(Company.class, "id");
xstream.useAttributeFor(Company.class, "name");
xstream.aliasAttribute("companyName", "name");
// JAVA OBJECT --> XML
String xml = xstream.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<company id="111" companyName="Microsoft">
<websites>
<string>http://microsoft.com</string>
<string>http://msn.com</string>
<string>http://hotmail.com</string>
</websites>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</company>
Псевдоним Package
PackageAliasingExample.java
package org.o7planning.xstreamtutorial;
import org.o7planning.xstreamtutorial.beans.Address;
import org.o7planning.xstreamtutorial.beans.Company;
import com.thoughtworks.xstream.XStream;
public class PackageAliasingExample {
public static void main(String[] args) {
Company company = DataDAO.createCompany();
XStream xstream = new XStream();
String packgeName= Address.class.getPackage().getName();
// aliasPackage(String name, String pkgName).
xstream.aliasPackage("com.newcompany", packgeName);
// JAVA OBJECT --> XML
String xml = xstream.toXML(company);
System.out.println(xml);
}
}
Запуск примера:
<com.newcompany.Company>
<id>111</id>
<name>Microsoft</name>
<websites>
<string>http://microsoft.com</string>
<string>http://msn.com</string>
<string>http://hotmail.com</string>
</websites>
<address>
<street>1 Microsoft Way</street>
<city>Redmond</city>
</address>
</com.newcompany.Company>
6. XStream Annotation
С XStream вы можете использовать код для изменения XML созданного из Java, используя Alias указанный выше. Так же можете использовать Annotation чтобы указатьi XStream способ создания XML из Java.
Список Annotation:
Список Annotation:
- @XStreamAlias
- @XStreamAsAttribute
- @XStreamImplicit
- @XStreamOmitField
Using Code | Using Annotation |
xs.alias("dept", Department.class); | @XStreamAlias("dept")
public class Department { } |
xs.aliasField("no", Department.class, "deptNo"); | @XStreamAlias("no")
private int deptNo; |
xs.useAttributeFor(Department.class, "deptNo") | @XStreamAsAttribute
private int deptNo; |
xs.omitField(Employee.class, "bonus"); | @XStreamOmitField
private float bonus; |
xs.addImplicitCollection(Department.class, "employees"); | @XStreamImplicit
private List<Employee> employees; |
Department.java
package org.o7planning.xstreamtutorial.beans;
import java.util.List;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamImplicit;
@XStreamAlias("dept")
public class Department {
@XStreamAlias("no")
@XStreamAsAttribute
private int deptNo;
@XStreamAlias("name")
private String deptName;
@XStreamImplicit
private List<Employee> employees;
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.java
package org.o7planning.xstreamtutorial.beans;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamAsAttribute;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
@XStreamAlias("emp")
public class Employee {
@XStreamAlias("no")
@XStreamAsAttribute
private int empNo;
private String empName;
private float salary;
// Ignore this field.
@XStreamOmitField
private float bonus;
public Employee(int empNo, String empName, float salary) {
this.empNo = empNo;
this.empName = empName;
this.salary = salary;
}
public int getEmpNo() {
return empNo;
}
public void setEmpNo(int empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public float getBonus() {
return bonus;
}
public void setBonus(float bonus) {
this.bonus = bonus;
}
}
XStreamAnnotationExample.java
package org.o7planning.xstreamtutorial;
import java.util.ArrayList;
import java.util.List;
import org.o7planning.xstreamtutorial.beans.Department;
import org.o7planning.xstreamtutorial.beans.Employee;
import com.thoughtworks.xstream.XStream;
public class XStreamAnnotationExample {
public static void main(String[] args) {
Department dept = createDepartment();
XStream xstream = new XStream();
// Using annotations in class Department
xstream.processAnnotations(Department.class);
// Using annotations in class Employee
xstream.processAnnotations(Employee.class);
String xml = xstream.toXML(dept);
System.out.println(xml);
}
public static Department createDepartment() {
Department dept = new Department();
dept.setDeptNo(10);
dept.setDeptName("ACCOUNTING");
Employee king = new Employee(7839, "KING", 5000f);
Employee clark = new Employee(7839, "CLARK", 2450f);
Employee miller = new Employee(7839, "MILLER", 1300f);
List<Employee> list = new ArrayList<Employee>();
list.add(king);
list.add(clark);
list.add(miller);
dept.setEmployees(list);
return dept;
}
}
Запуск примера:
<dept no="10">
<name>ACCOUNTING</name>
<emp no="7839">
<empName>KING</empName>
<salary>5000.0</salary>
</emp>
<emp no="7839">
<empName>CLARK</empName>
<salary>2450.0</salary>
</emp>
<emp no="7839">
<empName>MILLER</empName>
<salary>1300.0</salary>
</emp>
</dept>
Java Open source libraries
- Руководство Java JSON Processing API (JSONP)
- Использование Scribe OAuth Java API с Google OAuth 2
- Получить информацию об оборудовании в приложении Java
- Restfb Java API для Facebook
- Создание Credentials для Google Drive API
- Руководство Java JDOM2
- Руководство Java XStream
- Использование Java JSoup для анализа кода HTML
- Получение географической информации на основе IP-адреса с помощью GeoIP2 Java API
- Чтение и запись файла Excel в Java с использованием Apache POI
- Изучите Facebook Graph API
- Манипулирование файлами и папками в Google Drive с использованием Java
Show More