XStream教程
XStream是一个简单的基于Java库,Java对象序列化到XML,反之亦然(即:可以轻易的将Java对象和xml文档相互转换)。
特点
- 使用方便 - XStream的API提供了一个高层次外观,以简化常用的用例。
- 无需创建映射 - XStream的API提供了默认的映射大部分对象序列化。
- 性能 - XStream快速和低内存占用,适合于大对象图或系统。
- 干净的XML - XStream创建一个干净和紧凑XML结果,这很容易阅读。
- 不需要修改对象 - XStream可序列化的内部字段,如私有和最终字段,支持非公有制和内部类。默认构造函数不是强制性的要求。
- 完整对象图支持 - XStream允许保持在对象模型中遇到的重复引用,并支持循环引用。
- 可自定义的转换策略 - 定制策略可以允许特定类型的定制被表示为XML的注册。
- 安全框架 - XStream提供了一个公平控制有关解组的类型,以防止操纵输入安全问题。
- 错误消息 - 出现异常是由于格式不正确的XML时,XStream抛出一个统一的例外,提供了详细的诊断,以解决这个问题。
- 另一种输出格式 - XStream支持其它的输出格式,如JSON。
常见的用途
- 传输
- 持久化
- 配置
- 单元测试
XStream环境设置 - XStream教程
本地环境设置
如果愿意设置Java编程语言环境,那么这部分指导如何下载和设置Java在机器上。请按照以下步骤来设置环境。
Java SE是免费的,提供的链接下载Java。所以,根据操作系统版本下载。
按照说明下载java并运行.exe到机器上安装Java。机器上安装了Java以后,还需要设置环境变量指向正确的安装目录:
为Windows 2000/XP设置路径:
假设安装在c:Program Filesjavajdk目录:
- 在“我的电脑”右键单击并选择“属性”。
- 在“高级”选项卡下单击“环境变量”按钮。
- 现在,改变“Path”变量,因此,它也包含了Java可执行文件的路径。例如,如果路径当前设置为“C:WINDOWSSYSTEM32”,然后更改您的路径如“'C:WINDOWSSYSTEM32;c:Program Filesjavajdkin”。
为Linux,UNIX,Solaris和FreeBSD设置Java路径:
环境变量PATH应设置为指向已安装的Java二进制文件的位置。请参考shell文件。
例如,如果使用bash作为shell,那么将下面的行添加到'.bashrc'文件的结尾:export PATH=/path/to/java:$PATH'
流行的Java编辑器:
编写Java程序,需要一个文本编辑器。在市场上有很多可用更复杂的IDE。现在,可以考虑下列之一:
- Notepad: 在Windows机器上,可以使用像记事本的任何简单的文本编辑器(推荐本教程),TextPad。
- Netbeans: 是一个Java IDE,它是开源和免费的,可从以下地址下载 http://www.netbeans.org/index.html.
- Eclipse: 也是一个Java IDE由Eclipse开源社区开发,可以从下载http://www.eclipse.org/.
下载XStream的归档文件
下载最新的版本XStream的jar文件从 xstream-1.4.7.jar,在写这篇教程的时候,下载的是 XStream-1.4.7.jar 并将其复制到 C:> XStream 文件夹中。
OS | 归档名称 |
Windows | xstream-1.4.7.jar |
Linux | xstream-1.4.7.jar |
Mac | xstream-1.4.7.jar |
设置XStream环境
将用xstream_home环境变量指向 Guava jar 存储在计算机上的基本目录位置。假设,我们已经提取XStream-1.4.7.jar在各种操作系统XStream文件夹,如下所示。
OS | 输出 |
Windows | 设置环境变量 XStream_HOME 为 C:XStream |
Linux | export XStream_HOME=/usr/local/XStream |
Mac | export XStream_HOME=/Library/XStream |
设置CLASSPATH变量
设置 CLASSPATH 环境变量指向 XStream jar 位置。假设,我们已经存储 XStream-1.4.7.jar 在 XStream 文件夹的不同的操作系统如下。
OS | 输出 |
Windows | 设置环境变量 CLASSPATH 为 %CLASSPATH%;%XStream_HOME%xstream-1.4.7.jar;.; |
Linux | export CLASSPATH=$CLASSPATH:$XStream_HOME/xstream-1.4.7.jar:. |
Mac | export CLASSPATH=$CLASSPATH:$XStream_HOME/xstream-1.4.7.jar:. |
XStream入门应用程序 - XStream教程
在进入XStream库的细节之前,让我们来看看应用程序操作。在这个例子中,我们创建Student和Address类。还将创建一个Student对象,然后将其序列化到一个XML字符串。然后反序列化的同一个XML字符串,以重新获得学生对象。
创建一个名为XStreamTester的Java类文件在 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 String firstName;
private String lastName;
private int rollNo;
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对象。
通过它传递一个StaxDriver创建XStream对象。StaxDriver使用SAX解析器(可从Java6),一个快速的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混叠 - XStream教程
混叠是一种技术来定制生成XML或者使用XStream特定的格式化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 测试上述对象序列化。
创建一个Java类名为XStreamTester在文件 C:\>XStream_WORKSPACE\com\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
现在运行XStreamTester看到的结果:
C:\XStream_WORKSPACE\com\yiibai\xstream>java XStreamTester
验证输出
<?xml version="1.0" encoding="UTF-8"?>
<com.yiibai.xstream.Student>
<studentName>Mahesh</studentName>
<notes>
<com.yiibai.xstream.Note>
<title>first</title>
<description>My first assignment.</description>
</com.yiibai.xstream.Note>
<com.yiibai.xstream.Note>
<title>second</title>
<description>My Second assignment.</description>
</com.yiibai.xstream.Note>
</notes>
</com.yiibai.xstream.Student>
在上面的结果,我们已经看到了Student对象名称是完全合格的。要替换它作为学生的标签,按照下面的链接。
另外,在上述结果中可以看出,所需studentName要重命名来命名。要取代它,按照下面的链接。
在上面的结果,我们可以看到,笔记标记被添加成为笔记列表。替换它,按照下面的链接。
在上面的结果,我们可以看到这个名字来作为一个子节点,需要将它作为根节点的属性。替换它,按照下面的链接。
XStream注解 - XStream教程
XStream支持注释做同样的任务,正如我们在前面的章节中是自动配置,而不是代码1所做的。在前面的章节中,我们已经看到了下面的代码配置。
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");
下面的代码片段来说明使用annoations更容易的方式做同样的工作。
@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\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
现在运行XStreamTester看到的结果:
C:\XStream_WORKSPACE\com\yiibai\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提供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\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
现在运行XStreamTester看到的结果:
C:\XStream_WORKSPACE\com\yiibai\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\yiibai\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对象流 - 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\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
现在运行XStreamTester看到的结果:
C:\XStream_WORKSPACE\com\yiibai\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\yiibai\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。
现在,让我们使用XStream处理JSON的代码测试。
创建一个Java类名为XStreamTester文件在 C:\>XStream_WORKSPACE\com\yiibai\xstream.
File: XStreamTester.java
package com.yiibai.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\yiibai\xstream>javac XStreamTester.java
现在运行XStreamTester看到的结果:
C:\XStream_WORKSPACE\com\yiibai\xstream>java XStreamTester
验证输出
{
"firstName": "Mahesh",
"lastName": "Parashar"
}




