Xstream - 快速指南
XStream - 概述
XStream 是一个简单的基于 Java 的库,用于将 Java 对象序列化为 XML,反之亦然。
功能
易于使用 − XStream API 提供高级外观以简化常见用例。
无需创建映射 − XStream API 为大多数要序列化的对象提供默认映射。
性能 − XStream 速度快且内存占用低,适用于大型对象图或系统。
干净的 XML − XStream 生成干净、紧凑且易于阅读的 XML 输出。
无需修改对象 − XStream 序列化内部字段(如私有和最终字段),并支持非公共和内部类。默认构造函数不是强制性要求。
完整的对象图支持 − XStream 允许维护对象模型中遇到的重复引用,并且还支持循环引用。
可自定义的转换策略 − 可以注册自定义策略,以允许自定义特定类型以 XML 表示。
安全框架 − XStream 对未编组类型提供公平控制,以防止操纵输入导致的安全问题。
错误消息 − 当由于格式错误的 XML 而发生异常时,它会提供详细的诊断来解决问题。
替代输出格式 − XStream 支持其他输出格式,如 JSON 和变形。
常见用途
传输 − XML 是对象的文本表示形式,可用于通过网络传输对象,与所使用的序列化/反序列化技术无关。
持久性 − 对象可以作为 XML 持久保存在数据库中,并可在需要时进行编组/解组。
配置 − XML 是不言自明的,并且大量用于定义配置。将对象转换为 XML 表示形式后,也可以将其用于配置目的。
单元测试 − XStream API 与 JUnit 兼容,可用于增强应用程序模块的单元测试。
Xstream - 环境
在本章中,我们将讨论为 Java 设置合适环境的不同方面。
本地环境设置
如果您想为 Java 编程语言设置环境,那么本节将介绍如何在您的机器上下载和设置 Java。请按照以下步骤设置您的 Java 环境。
可以从链接 − 免费下载 Java SE
按照说明下载 Java 并运行 .exe 以在您的机器上安装 Java。在计算机上安装 Java 后,您需要设置环境变量以指向正确的安装目录 −
设置 Windows 2000/XP 的路径
假设您已在 c:\Program Files\java\jdk 目录中安装了 Java −
右键单击"我的电脑",然后选择"属性"。
单击"高级"选项卡下的"环境变量"按钮。
更改"路径"变量,使其也包含 Java 可执行文件的路径。例如,如果路径当前设置为"C:\WINDOWS\SYSTEM32",则将路径更改为"C:\WINDOWS\SYSTEM32;c:\Program Files\java\jdk\bin"。
设置 Windows 95/98/ME 的路径
假设您已在 c:\Program Files\java\jdk 目录中安装了 Java −
编辑"C:\autoexec.bat"文件并在末尾添加以下行 −
'SET PATH = %PATH%;C:\Program Files\java\jdk\bin'
设置 Linux、UNIX、Solaris、FreeBSD 的路径
应将环境变量 PATH 设置为指向Java 二进制文件已安装。如果执行此操作时遇到问题,请参阅 shell 文档。
例如,如果您使用 bash 作为 shell,则应在 '.bashrc: export PATH=/path/to/java:$PATH' 的末尾添加以下行
常用 Java 编辑器
要编写 Java 程序,您需要一个文本编辑器。市场上有更复杂的 IDE。但目前,您可以考虑以下之一 −
记事本 − 在 Windows 上,您可以使用任何简单的文本编辑器,如记事本(本教程推荐使用)或 TextPad。
Netbeans −它是一个免费的 Java IDE,可以从 https://www.netbeans.org/index.html 下载。
Eclipse − 它也是由 eclipse 开源社区开发的 Java IDE,可以从 https://www.eclipse.org/ 下载。
下载 XStream 存档
从 XStream 下载页面 下载最新版本的 XStream jar 文件。在撰写本教程时,我们已下载 xstream-1.4.18.jar 并将其复制到 C:\>XStream 文件夹中。
| OS | 存档名称 |
|---|---|
| Windows | xstream-1.4.18.jar |
| Linux | xstream-1.4.18.jar |
| Mac | xstream-1.4.18.jar |
设置 XStream 环境
设置 XStream_HOME 环境变量以指向 xstream jar 存储在您机器上的基本目录位置。下表显示了如何在 Windows、Linux 和 Mac 上设置 XStream 环境,假设我们已经在 XStream 文件夹中提取了 xstream-1.4.18.jar。
| Sr.No. | OS &描述 |
|---|---|
| 1 | Windows 将环境变量 XStream_HOME 设置为 C:\XStream |
| 2 | Linux export XStream_HOME=/usr/local/XStream |
| 3 | Mac export XStream_HOME=/Library/XStream |
设置 CLASSPATH 变量
设置 CLASSPATH 环境变量以指向 XStream jar 位置。下表显示了如何在 Windows、Linux 和 Mac 系统上设置 CLASSPATH 变量,假设我们已将 xstream-1.4.18.jar 存储在 XStream 文件夹中。
| Sr.No. | OS & 说明 |
|---|---|
| 1 |
Windows 将环境变量 CLASSPATH 设置为 %CLASSPATH%;%XStream_HOME%\xstream-1.4.18.jar; |
| 2 | Linux export CLASSPATH=$CLASSPATH:$XStream_HOME/xstream-1.4.18.jar; |
| 3 | Mac export CLASSPATH=$CLASSPATH:$XStream_HOME/xstream-1.4.18.jar; |
XStream - 第一个应用程序
在深入了解 XStream 库的细节之前,让我们先看一个实际的应用程序。在这个例子中,我们创建了 Student 和 Address 类。我们将创建一个学生对象,然后将其序列化为 XML 字符串。然后对相同的 XML 字符串进行反序列化以获取学生对象。
在 C:\>XStream_WORKSPACE 中创建一个名为 XStreamTester 的 java 类文件。
文件: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("
firstName: ");
stringBuilder.append(firstName);
stringBuilder.append("
lastName: ");
stringBuilder.append(lastName);
stringBuilder.append("
rollNo: ");
stringBuilder.append(rollNo);
stringBuilder.append("
className: ");
stringBuilder.append(className);
stringBuilder.append("
address: ");
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("
Address [ ");
stringBuilder.append("
area: ");
stringBuilder.append(area);
stringBuilder.append("
city: ");
stringBuilder.append(city);
stringBuilder.append("
state: ");
stringBuilder.append(state);
stringBuilder.append("
country: ");
stringBuilder.append(country);
stringBuilder.append("
pincode: ");
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 对象
通过向其传递 StaxDriver 来创建 XStream 对象。StaxDriver 使用 Stax pull 解析器(从 java 6 开始可用),并且是一个快速的 xml 解析器。
XStream xstream = new XStream(new StaxDriver());
步骤 2:将对象序列化为 XML
使用 toXML() 方法获取对象的 XML 字符串表示形式。
//对象到 XML 的转换 String xml = xstream.toXML(student);
步骤 3:反序列化 XML 以获取对象
使用 fromXML() 方法从 XML 获取对象。
//XML 到对象的转换 Student student1 = (Student)xstream.fromXML(xml);
XStream - 别名
别名是一种使用 XStream 自定义生成的 XML 或使用特定格式的 XML 的技术。假设要使用以下 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 测试上述对象序列化。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\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") //定义类级别别名
class Student {
@XStreamAlias("name") //定义字段级别别名
@XStreamAsAttribute //将字段定义为属性
private String studentName;
@XStreamImplicit //将列表定义为隐式集合
private List<Note> notes = new ArrayList<Note>();
@XStreamOmitField //省略字段以使其不成为 XML 的一部分
private int type;
}
让我们使用 XStream 测试上述注解。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\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 或将 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 中测试无转换器的代码。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\xstream>java XStreamTester
验证输出,如下所示 −
<?xml version = "1.0" encoding = "UTF-8"?>
<student>
<name>
<firstName>Mahesh</firstName>
<lastName>Parashar</lastName>
</name>
</student>
带转换器的示例
现在让我们在 XStream 中使用转换器测试代码。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\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 中的对象流测试代码。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\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
查看 C:\>XStream_WORKSPACE\com utorialspoint\xstream 文件夹中的 test.txt 内容。
<?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 - 使用 XStream 编写 JSON
XStream 通过使用适当的驱动程序初始化 XStream 对象来支持 JSON。XStream 目前支持 JettisonMappedXmlDriver 和 JsonHierarchicalStreamDriver。
现在让我们在 XStream 中使用 json 处理来测试代码。
在 C:\>XStream_WORKSPACE\com utorialspoint\xstream 中创建一个名为 XStreamTester 的 java 类文件。
文件: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 utorialspoint\xstream>javac XStreamTester.java
现在运行 XStreamTester 以查看结果 −
C:\XStream_WORKSPACE\com utorialspoint\xstream>java XStreamTester
验证输出,如下所示 −
{
"firstName": "Mahesh",
"lastName": "Parashar"
}

