暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

XStream教程

原创 yBmZlQzJ 2023-08-15
658

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"
}

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论