1、简介
xstream是一个用于序列化和反序列化的java库,主要是java对象和xml之间相互转换。
XStream反序列化同fastjson这种不一样的地方是fastjson会在反序列化的时候主动去调用getters和setters,而XStream的反序列化过程中赋值都有Java的反射机制来完成,所以并没有这样主动调用的特性。
特点
- 使用方便 - XStream的API提供了一个高层次外观,以简化常用的用例
- 无需创建映射 - XStream的API提供了默认的映射大部分对象序列化
- 性能 - XStream快速和低内存占用,适合于大对象图或系统
- 干净的XML - XStream创建一个干净和紧凑XML结果,这很容易阅读
- 不需要修改对象 - XStream可序列化的内部字段,如私有和最终字段,支持非公有制和内部类,默认构造函数不是强制性的要求
- 完整对象图支持 - XStream允许保持在对象模型中遇到的重复引用,并支持循环引用
- 可自定义的转换策略 - 定制策略可以允许特定类型的定制被表示为XML的注册
- 安全框架 - XStream提供了一个公平控制有关解组的类型,以防止操纵输入安全问题
- 错误消息 - 出现异常是由于格式不正确的XML时,XStream抛出一个统一的例外,提供了详细的诊断,以解决这个问题
- 另一种输出格式 - XStream支持其它的输出格式,如JSON
2、举例
引入xstream
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.16</version>
</dependency>
随便创建一个Student类,用于反序列化和被反序列化:
package xstream;
public class Student {
public String name;
public String sex;
//@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
public Object myObject;
public Student(){
System.out.println("Student 构造函数");
}
public String getName(){
System.out.println("getName");
return name;
}
public void setName(String name){
System.out.println("setName");
this.name = name;
}
public String getSex(){
System.out.println("getSex");
return sex;
}
public void setSex(String sex){
System.out.println("setSex");
this.sex = sex;
}
public Object getMyObject() {
System.out.println("getMyObject");
return myObject;
}
public void setMyObject(Object myObject) {
System.out.println("setMyObject");
this.myObject = myObject;
}
@Override
public String toString() {
return String.format("Student.name=%s, Student.sex=%s", name, sex);
}
}
具体实现栗子
package xstream;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.StaxDriver;
import java.io.IOException;
public class XstreamPoc {
public static void main(String[] args) throws IOException {
poc01();
}
public static void poc01() throws IOException {
Student student = new Student();
student.setName("5wimming");
student.setSex("boy");
XStream xstream = new XStream(new StaxDriver());
String xml = xstream.toXML(student);
System.out.println(xml);
Student student02 =