XStream库的基本介绍
XStream是Java生态中常用的XML处理工具,核心能力是实现Java对象与XML字符串的双向转换,不需要开发者手动编写XML解析或生成的代码,大大降低了开发成本。它支持大部分常见的Java数据类型,包括基本类型、集合、自定义类等,使用起来非常灵活。

环境引入
要使用XStream库,首先需要在项目中引入对应的依赖。如果是Maven项目,可以在pom.xml中添加如下依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.20</version>
</dependency>
如果是普通Java项目,可以下载XStream的jar包,手动导入到项目的类路径中即可。
基础使用示例
定义测试用的Java类
首先我们定义一个简单的自定义类,用于后续的转换测试:
public class User {
private String name;
private int age;
private String email;
// 必须提供无参构造方法,XStream反序列化时需要
public User() {}
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// getter和setter方法
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Java对象转XML
使用XStream将Java对象转换为XML非常简单,只需要创建XStream实例,调用toXML方法即可:
import com.thoughtworks.xstream.XStream;
public class XStreamDemo {
public static void main(String[] args) {
// 创建XStream实例
XStream xstream = new XStream();
// 创建测试对象
User user = new User("张三", 25, "zhangsan@ipipp.com");
// 将对象转换为XML字符串
String xml = xstream.toXML(user);
System.out.println(xml);
}
}
运行上述代码,输出的XML内容如下:
<com.thoughtworks.xstream.demo.User> <name>张三</name> <age>25</age> <email>zhangsan@ipipp.com</email> </com.thoughtworks.xstream.demo.User>
XML转Java对象
将XML字符串转换回Java对象,使用fromXML方法即可:
import com.thoughtworks.xstream.XStream;
public class XStreamDemo {
public static void main(String[] args) {
XStream xstream = new XStream();
// 待转换的XML字符串
String xml = "<com.thoughtworks.xstream.demo.User>n" +
" <name>李四</name>n" +
" <age>30</age>n" +
" <email>lisi@ipipp.com</email>n" +
"</com.thoughtworks.xstream.demo.User>";
// 将XML转换为Java对象
User user = (User) xstream.fromXML(xml);
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("邮箱:" + user.getEmail());
}
}
运行后可以得到反序列化出来的User对象,输出对应的属性值。
常用进阶配置
自定义别名
默认情况下,XStream生成的XML标签会使用类的全限定名,可读性较差,我们可以通过别名配置简化标签名称:
import com.thoughtworks.xstream.XStream;
public class XStreamDemo {
public static void main(String[] args) {
XStream xstream = new XStream();
// 给User类设置别名,XML中会用user作为根标签
xstream.alias("user", User.class);
// 给字段设置别名,可选
xstream.aliasField("userName", User.class, "name");
User user = new User("王五", 28, "wangwu@ipipp.com");
String xml = xstream.toXML(user);
System.out.println(xml);
}
}
配置别名后的输出XML如下:
<user> <userName>王五</userName> <age>28</age> <email>wangwu@ipipp.com</email> </user>
处理集合类型
XStream对集合类型也有很好的支持,比如List、Map等,我们可以直接转换包含集合的对象:
import com.thoughtworks.xstream.XStream;
import java.util.ArrayList;
import java.util.List;
public class UserGroup {
private String groupName;
private List<User> users;
public UserGroup() {
users = new ArrayList<>();
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
class XStreamDemo {
public static void main(String[] args) {
XStream xstream = new XStream();
xstream.alias("userGroup", UserGroup.class);
xstream.alias("user", User.class);
UserGroup group = new UserGroup();
group.setGroupName("开发组");
group.getUsers().add(new User("张三", 25, "zhangsan@ipipp.com"));
group.getUsers().add(new User("李四", 30, "lisi@ipipp.com"));
String xml = xstream.toXML(group);
System.out.println(xml);
}
}
输出的XML会正确包含集合中的所有User对象,反序列化时也能正确还原集合结构。
使用注意事项
- 被转换的Java类需要提供无参构造方法,否则XStream反序列化时会抛出异常
- 如果需要转换的字段是私有的,不需要提供getter和setter也可以正常转换,XStream会通过反射直接访问字段
- 对于包含敏感信息的类,不建议直接使用XStream的默认配置,因为默认会序列化所有字段,可能需要通过权限配置限制序列化的字段范围
- 如果XML结构发生变化,需要对应调整别名配置,否则反序列化可能会出现字段映射错误的问题