XStream是Java生态中常用的XML序列化与反序列化工具,无需复杂配置就能实现普通Java Bean和XML字符串的快速转换,大幅降低XML数据处理的工作量。它支持自定义别名、字段映射、集合处理等特性,适配多数常规业务场景。
XStream环境准备
首先需要在项目中引入XStream的依赖,如果你使用Maven构建项目,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.20</version>
</dependency>
如果是普通Java项目,可以下载XStream的jar包手动导入到项目类路径中即可。
基础Bean定义
我们先定义一个简单的用户Bean作为转换的示例对象,包含用户id、用户名、年龄三个基础属性,同时提供对应的getter、setter方法和无参构造方法,XStream转换时需要Bean存在无参构造:
public class User {
private Integer id;
private String name;
private Integer age;
// 必须提供无参构造
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Bean转XML示例
使用XStream将Bean对象转换为XML字符串非常简单,只需要创建XStream实例,调用toXML方法即可,以下是完整示例:
import com.thoughtworks.xstream.XStream;
public class BeanToXmlDemo {
public static void main(String[] args) {
// 创建XStream实例
XStream xStream = new XStream();
// 创建测试Bean对象
User user = new User(1, "张三", 25);
// 将Bean转换为XML字符串
String xml = xStream.toXML(user);
System.out.println("Bean转XML结果:");
System.out.println(xml);
}
}
运行上述代码,输出的XML内容如下:
<User> <id>1</id> <name>张三</name> <age>25</age> </User>
XML转Bean示例
将XML字符串转换回Bean对象,只需要调用XStream的fromXML方法,传入XML字符串即可,示例如下:
import com.thoughtworks.xstream.XStream;
public class XmlToBeanDemo {
public static void main(String[] args) {
// 创建XStream实例
XStream xStream = new XStream();
// 待转换的XML字符串
String xml = "<User><id>1</id><name>张三</name><age>25</age></User>";
// 将XML转换为Bean对象
User user = (User) xStream.fromXML(xml);
System.out.println("XML转Bean结果:");
System.out.println("用户id:" + user.getId());
System.out.println("用户名:" + user.getName());
System.out.println("用户年龄:" + user.getAge());
}
}
运行后可以看到正确输出Bean的各个属性值,说明XML转Bean成功。
自定义别名优化XML格式
默认情况下XStream生成的XML标签会使用类的全限定名或者简单类名,我们可以通过别名配置让XML格式更符合预期,比如将根标签改为user,将字段名改为更简洁的形式:
import com.thoughtworks.xstream.XStream;
public class AliasDemo {
public static void main(String[] args) {
XStream xStream = new XStream();
// 设置类别名,根标签会变成user
xStream.alias("user", User.class);
// 设置字段别名,id标签改为user_id
xStream.aliasField("user_id", User.class, "id");
// 设置字段别名,name标签改为user_name
xStream.aliasField("user_name", User.class, "name");
User user = new User(2, "李四", 30);
String xml = xStream.toXML(user);
System.out.println("自定义别名后的XML:");
System.out.println(xml);
// 反序列化时也需要设置相同的别名才能正确映射
User parseUser = (User) xStream.fromXML(xml);
System.out.println("反序列化后的用户名:" + parseUser.getName());
}
}
上述代码运行后生成的XML如下,标签名更符合常规XML的命名习惯:
<user> <user_id>2</user_id> <user_name>李四</user_name> <age>30</age> </user>
复杂对象转换处理
如果Bean中包含集合、嵌套对象等复杂结构,XStream同样可以正常处理,我们定义一个包含订单列表的用户类来演示:
import java.util.List;
public class OrderUser {
private Integer id;
private String name;
private List<String> orders;
public OrderUser() {
}
public OrderUser(Integer id, String name, List<String> orders) {
this.id = id;
this.name = name;
this.orders = orders;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getOrders() {
return orders;
}
public void setOrders(List<String> orders) {
this.orders = orders;
}
}
复杂对象的转换示例:
import com.thoughtworks.xstream.XStream;
import java.util.ArrayList;
import java.util.List;
public class ComplexDemo {
public static void main(String[] args) {
XStream xStream = new XStream();
// 设置类别名
xStream.alias("orderUser", OrderUser.class);
xStream.alias("order", String.class);
// 创建包含集合的Bean对象
List<String> orderList = new ArrayList<>();
orderList.add("订单1001");
orderList.add("订单1002");
OrderUser orderUser = new OrderUser(3, "王五", orderList);
// Bean转XML
String xml = xStream.toXML(orderUser);
System.out.println("复杂对象转XML结果:");
System.out.println(xml);
// XML转Bean
OrderUser parseUser = (OrderUser) xStream.fromXML(xml);
System.out.println("解析后的订单列表:" + parseUser.getOrders());
}
}
运行后可以看到集合属性也能正确转换,嵌套结构处理无需额外复杂配置。
注意事项
- XStream默认会序列化所有非静态、非瞬态的字段,如果有不需要序列化的字段,可以添加
transient修饰符,或者通过xStream.omitField(Class, String)方法排除指定字段。 - 反序列化XML时,需要确保XML的结构和Bean的属性结构匹配,否则会抛出转换异常。
- 如果Bean中没有无参构造方法,XStream反序列化时会报错,需要手动添加无参构造。
- 生产环境中如果需要处理不可信的XML输入,建议开启XStream的安全配置,避免反序列化漏洞。
XStreamBean_to_xmlxml_to_BeanJava序列化修改时间:2026-07-23 21:40:02