1、简述
XStream 是一个简单便捷的 Java 库,用于对象与 XML 的相互转换。其主要特点是:
🔥 易于使用:无需复杂的配置即可直接使用。
🔥 支持自定义:可以灵活地定制对象的序列化和反序列化规则。
🔥 强大的功能:支持注解、自定义转换器等。
本文将详细介绍 XStream 的基本使用方法,并通过一些实践样例来展示其强大之处。

2、引入依赖
在使用 XStream 前,需要在项目中引入其依赖。如果使用 Maven,可以添加以下依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.20</version>
</dependency>
如果使用 Gradle,则添加以下内容:
implementation 'com.thoughtworks.xstream:xstream:1.4.20'
3、基本用法
3.1 对象转 XML
以下是一个简单的示例,将一个 Java 对象转换为 XML:
import com.thoughtworks.xstream.XStream;
public class Main {
public static void main(String[] args) {
XStream xstream = new XStream();
// 创建对象
Person person = new Person("John", 30);
// 将对象转为 XML
String xml = xstream.toXML(person);
System.out.println(xml);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
}
运行结果:
<person>
<name>John</name>
<age>30</age>
</person>
3.2 XML 转对象
以下是从 XML 转换为对象的示例:
import com.thoughtworks.xstream.XStream;
public class ConverterXmlExample {
public static void main(String[] args) {
XStream xstream = new XStream();
// 安全设置:允许反序列化的类
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[] {Person.class});
// 或者使用通配符,允许指定包下的类
xstream.allowTypesByWildcard(new String[] {"com.lm.xstream.ele.**"});
// XML 字符串
String xml = "<person> <name>John</name> <age>30</age> </person> ";
// XML 转对象
xstream.alias("person", Person.class); // 设置别名
Person person = (Person) xstream.fromXML(xml);
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
}
}
class Person {
private String name;
private int age;
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
Name: John
Age: 30
4、高级用法
4.1 使用注解
XStream 支持使用注解来定义 XML 与对象的映射关系。
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("person")
class Person {
@XStreamAlias("full_name")
private String name;
@XStreamAlias("years_old")
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
}
public class Main {
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.processAnnotations(Person.class); // 启用注解处理
// 创建对象
Person person = new Person("John", 30);
// 对象转 XML
String xml = xstream.toXML(person);
System.out.println(xml);
}
}
运行结果:
<person>
<full_name>John</full_name>
<years_old>30</years_old>
</person>
4.2 自定义转换器
可以通过自定义转换器来灵活地控制序列化和反序列化过程。
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
class PersonConverter implements Converter {
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Person2 person = (Person2) source;
writer.startNode("name");
writer.setValue(person.getName());
writer.endNode();
writer.startNode("age");
writer.setValue(String.valueOf(person.getAge()));
writer.endNode();
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
String name = null;
int age = 0;
while (reader.hasMoreChildren()) {
reader.moveDown();
String nodeName = reader.getNodeName();
if ("name".equals(nodeName)) {
name = reader.getValue();
} else if ("age".equals(nodeName)) {
age = Integer.parseInt(reader.getValue());
}
reader.moveUp();
}
return new Person2(name, age);
}
@Override
public boolean canConvert(Class aClass) {
return Person2.class.isAssignableFrom(aClass);
}
}
public class ConverterExample {
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.registerConverter(new PersonConverter());
// 安全设置:允许反序列化的类
XStream.setupDefaultSecurity(xstream);
xstream.allowTypes(new Class[] {Person.class});
// 或者使用通配符,允许指定包下的类
xstream.allowTypesByWildcard(new String[] {"com.lm.xstream.ele.**"});
// 创建对象
Person2 person = new Person2("John", 30);
// 对象转 XML
String xml = xstream.toXML(person);
System.out.println(xml);
// XML 转对象
Person2 newPerson = (Person2) xstream.fromXML(xml);
System.out.println("Name: " + newPerson.getName());
System.out.println("Age: " + newPerson.getAge());
}
}
运行结果:
<com.lm.xstream.ele.Person2>
<name>John</name>
<age>30</age>
</com.lm.xstream.ele.Person2>
Name: John
Age: 30
5、总结
XStream 是一个功能强大且灵活的工具,可以轻松实现 Java 对象与 XML 之间的转换。通过本文的讲解和示例,相信你已经掌握了其基本用法和一些高级功能。
在实际项目中,XStream 可应用于配置文件解析、数据传输格式转换等场景。如果需要更多高级功能,可以参考官方文档进行探索。