XStream 是轻量级 Java 库,支持对象与 XML 双向序列化,无需注解或接口实现;默认用类名作根元素、字段名作子元素,支持私有字段直读写;提供 alias、omitField、aliasField 等配置,生产环境须配置类型白名单防反序列化风险。

XStream 是一个轻量级的 Java 库,专用于在 Java 对象和 XML 之间做双向序列化(即对象 ↔ XML),无需注解、无需实现特定接口、也不依赖反射配置,上手极快。
基础用法:对象转 XML
只需创建 XStream 实例,调用 toXML() 即可把对象转成格式化的 XML 字符串:
- 默认使用类名作为根元素,字段名作为子元素
- 支持基本类型、集合、嵌套对象(自动递归处理)
- 不需 getter/setter,直接读写字段(包括 private 字段)
示例:
XStream xstream = new XStream();
xstream.alias("person", Person.class); // 可选:自定义根标签名
String xml = xstream.toXML(new Person("张三", 28));
// 输出:张三 28
XML 转回 Java 对象
用 fromXML() 方法即可反序列化,XStream 会根据 XML 结构自动匹配字段并赋值:
立即学习“Java免费学习笔记(深入)”;
- 要求 XML 标签名与字段名一致(或通过 alias 映射)
- 支持带构造函数的对象,但推荐使用无参构造 + 字段直写
- 若字段类型是接口或抽象类,需用 registerConverter 或 alias 明确具体实现类
示例:
Person p = (Person) xstream.fromXML(xml); System.out.println(p.getName()); // 输出:张三
常用配置技巧
实际项目中常需调整默认行为,比如忽略字段、重命名标签、处理特殊类型:
- 忽略字段:xstream.omitField(Person.class, "id")
- 字段别名:xstream.aliasField("user-name", Person.class, "name")
-
集合序列化:默认用
- 包裹,可用 xstream.addImplicitCollection(Person.class, "hobbies") 去掉外层标签
- 防止 XSS/安全反序列化:生产环境务必调用 xstream.denyTypes(...) 或 allowTypes(...) 限制类白名单
注意事项与避坑点
XStream 简单但有几个关键细节容易出错:
- Java 类不能是匿名类、局部类或 Lambda 表达式生成的类
- 字段名含下划线或大小写混合时,XML 标签默认全小写(如 userName →
),可用 xstream.autodetectAnnotations(true) + @XStreamAlias 配合控制 - 新版 XStream(1.4.19+)默认禁用反射机制,需显式启用 Security Framework 或设置宽松策略(不推荐线上用)
- 若对象含循环引用(如父子双向关联),默认会报错,启用 xstream.setMode(XStream.ID_REFERENCES) 可支持










