Java XStream库怎么用 Java对象与XML互转

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 结构自动匹配字段并赋值:

  • 要求 XML 标签名与字段名一致(或通过 alias 映射)
  • 支持带构造函数的对象,但推荐使用无参构造 + 字段直写
  • 若字段类型是接口或抽象类,需用 registerConverteralias 明确具体实现类

示例:

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) 可支持