XStream的简单使用

本文介绍了XStream框架,它是用于处理XML文件序列化的框架,可将XML与JavaBean互转,也能处理JSON。文中给出简单示例,详细阐述了XStream序列化重命名、省略集合根节点等使用方法,还介绍了注解使用及持久化API,最后说明了使用的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢!
本文网址:https://blog.youkuaiyun.com/sun8112133/article/details/90482307








一、XStream概述

XStream 是一种 OXMapping 技术(Object XML Mapping,对象XML映射技术),是用来处理XML文件序列化的框架,在将 JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。XStream也可以将 JavaBean序列化 成 JSON 或反序列化,使用非常方便。
 
说白了就是:将XML转为JavaBean,或将JavaBean转为XML,也可以转JSON。

  • 所需Jar包

XStream不需要在配置文件中进行额外配置,只需要往工程中导入Jar包即可,以下是我使用的Jar包:

XStream使用Jar包

需要Jar包的小伙伴们可以点击这里下载:XStream依赖Jar包jettison1.0.1源码及Jar包



二、Hello XStream(简单例子)

1、实体类(Person类)

public class Person {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

2、测试类(Test类)

public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19);
        // 创建XStream对象
        XStream xStream = new XStream();
        System.out.println("XML序列化与反序列化:");
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
        
        System.out.println();
        System.out.println("JSON序列化与反序列化:");
        // 重新创建XStream对象,并设置JSON解析器(可支持序列化与反序列化)
        xStream = new XStream(new JettisonMappedXmlDriver());
        // JSON序列化(Person --> JSON)
        String json = xStream.toXML(person);
        System.out.println(json);
        // JSON反序列化(JSON --> Person)
        Person person3 = (Person) xStream.fromXML(json);
        System.out.println(person3);
    }
}

3、程序运行结果

Hello XStream


三、XStream使用

1、XStream序列化重命名

1)为包重命名

  • 语法格式: aliasPackage(别名, 原包名);
  • 演示代码:
public static void main(String[] args) {
    // 创建Person对象
    Person person = new Person("张三", 19);
    // 创建XStream对象
    XStream xStream = new XStream();
    // 为包重命名
    xStream.aliasPackage("new.bean", "com.bean");
    // XML序列化(Person --> XML)
    String xml = xStream.toXML(person);
    System.out.println(xml);
    // XML反序列化(XML --> Person)
    Person person2 = (Person) xStream.fromXML(xml);
    System.out.println(person2);
}
  • 运行结果:
aliasPackage
  • 注意: 同样适用于JSON。

2)为类重命名

  • 语法格式: alias(别名, 类的字节码对象);
  • 演示代码:
public static void main(String[] args) {
    // 创建Person对象
    Person person = new Person("张三", 19);
    // 创建XStream对象
    XStream xStream = new XStream();
    // 为类重命名
    xStream.alias("人", Person.class);
    // XML序列化(Person --> XML)
    String xml = xStream.toXML(person);
    System.out.println(xml);
    // XML反序列化(XML --> Person)
    Person person2 = (Person) xStream.fromXML(xml);
    System.out.println(person2);
}
  • 运行结果:
alias
  • 注意: 同样适用于JSON。

3)为字段重命名

  • 语法格式: aliasField(别名, 类的字节码对象, 原字段名);
  • 演示代码:
public static void main(String[] args) {
    // 创建Person对象
    Person person = new Person("张三", 19);
    // 创建XStream对象
    XStream xStream = new XStream();
    // 为字段重命名
    xStream.aliasField("姓名", Person.class, "name");
    // XML序列化(Person --> XML)
    String xml = xStream.toXML(person);
    System.out.println(xml);
    // XML反序列化(XML --> Person)
    Person person2 = (Person) xStream.fromXML(xml);
    System.out.println(person2);
}
  • 运行结果:
aliasField
  • 注意: 同样适用于JSON。

2、省略集合根节点

  • 语法格式: addImplicitCollection(类的字节码对象, 集合属性名);
  • 演示代码:
// 实体类
class Person {
    private String name;
    private int age;
    private List friends;
    
    public Person(String name, int age, List friends) {
        this.name = name;
        this.age = age;
        this.friends = friends;
    }
    
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19, Arrays.asList("李四", "王五", "周七"));
        // 创建XStream对象
        XStream xStream = new XStream();
        // 省略集合根节点
        xStream.addImplicitCollection(Person.class, "friends");
        System.out.println("XML序列化与反序列化:");
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
    }
}
  • 运行结果:
addImplicitCollection
  • 注意: 同样适用于JSON。

3、把字段节点设置成属性

  • 语法格式: useAttributeFor(类的字节码对象, 字段名);
  • 演示代码:
public static void main(String[] args) {
    // 创建Person对象
    Person person = new Person("张三", 19);
    // 创建XStream对象
    XStream xStream = new XStream();
    xStream.useAttributeFor(Person.class, "name");
    System.out.println("XML序列化与反序列化:");
    // XML序列化(Person --> XML)
    String xml = xStream.toXML(person);
    System.out.println(xml);
    // XML反序列化(XML --> Person)
    Person person2 = (Person) xStream.fromXML(xml);
    System.out.println(person2);

    System.out.println();
    System.out.println("JSON序列化与反序列化:");
    // 重新创建XStream对象,并设置JSON解析器(可支持序列化与反序列化)
    xStream = new XStream(new JettisonMappedXmlDriver());
    xStream.useAttributeFor(Person.class, "name");
    // JSON序列化(Person --> JSON)
    String json = xStream.toXML(person);
    System.out.println(json);
    // JSON反序列化(JSON --> Person)
    Person person3 = (Person) xStream.fromXML(json);
    System.out.println(person3);
}
  • 运行结果:
useAttributeFor
  • 注意: 同样适用于JSON。

4、隐藏字段

  • 语法格式: omitField(类的字节码对象, 字段名);
  • 演示代码:
public static void main(String[] args) {
    // 创建Person对象
    Person person = new Person("张三", 19);
    // 创建XStream对象
    XStream xStream = new XStream();
    // 隐藏字段
    xStream.omitField(Person.class, "name");
    // XML序列化(Person --> XML)
    String xml = xStream.toXML(person);
    System.out.println(xml);
    // XML反序列化(XML --> Person)
    Person person2 = (Person) xStream.fromXML(xml);
    System.out.println(person2);
}
  • 运行结果:
omitField
  • 注意: 同样适用于JSON。

5、XStream注解的使用

1)设置XStream应用注解

使用 XStream注解 前需要对 XStream 进行配置,可以使用两种方式:

  1. 检测某个 JavaBean类 的注解
  2. 自动检测所有 JavaBean类 的注解。
A. 自动检测指定类的注解
// 创建XStream对象
XStream xStream = new XStream();
// 指定检测Person类的注解
xStream.processAnnotations(Person.class);
B. 自动检测所有类的注解
// 创建XStream对象
XStream xStream = new XStream();
// 自动检测所有类的注解
xStream.autodetectAnnotations(true);

2)重命名注解(类、字段)

  • 语法格式: @XStreamAlias(别名)
  • 演示代码:
// 实体类
@XStreamAlias("人")
class Person {
	@XStreamAlias("名字")
	private String name;
	
	@XStreamAlias("年龄")
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19);
        // 创建XStream对象
        XStream xStream = new XStream();
        // 自动检测所有类的注解
        xStream.autodetectAnnotations(true);
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
    }
}
  • 运行结果:
注解重命名
  • 注意: 同样适用于JSON。

3)省略集合根节点

  • 语法格式: @XStreamImplicit
  • 演示代码:
// 实体类
class Person {
	private String name;
	private int age;
	
	// 隐藏集合根节点,使用默认的节点名,同样适合于JSON
	// @XStreamImplicit   
	// 隐藏集合根节点,并设置指定的节点名,只适合于XML,可能会导致无法反序列化
	@XStreamImplicit(itemFieldName="朋友")    
	private List friends;

	public Person(String name, int age, List friends) {
		super();
		this.name = name;
		this.age = age;
		this.friends = friends;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", friends=" + friends + "]";
	}
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19, Arrays.asList("李四", "王五", "周七"));
        // 创建XStream对象
        XStream xStream = new XStream();
        // 自动检测所有类的注解
        xStream.autodetectAnnotations(true);
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
    }
}
  • 运行结果:
注解省略集合根节点
  • 注意:

@XStreamImplicit: 隐藏集合根节点,使用默认的节点名,同样适合于JSON;

@XStreamImplicit(itemFieldName=“别名”): 隐藏集合根节点,并设置指定的节点名,只适合于XML,可能会导致无法反序列化。


4)把字段节点设置成属性

  • 语法格式: @XStreamAsAttribute
  • 演示代码:
// 实体类
class Person {
	@XStreamAsAttribute
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19);
        // 创建XStream对象
        XStream xStream = new XStream();
        // 自动检测所有类的注解
        xStream.autodetectAnnotations(true);
        System.out.println("XML序列化与反序列化:");
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
        
        System.out.println();
        System.out.println("JSON序列化与反序列化:");
        // 重新创建XStream对象,并设置JSON解析器(可支持序列化与反序列化)
        xStream = new XStream(new JettisonMappedXmlDriver());
        xStream.autodetectAnnotations(true);
        // JSON序列化(Person --> JSON)
        String json = xStream.toXML(person);
        System.out.println(json);
        // JSON反序列化(JSON --> Person)
        Person person3 = (Person) xStream.fromXML(json);
        System.out.println(person3);
    }
}
  • 运行结果:
注解把字段节点设置成属性
  • 注意: 同样适用于JSON。

5)隐藏字段

  • 语法格式: @XStreamOmitField
  • 演示代码:
// 实体类
class Person {
	@XStreamOmitField
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19);
        // 创建XStream对象
        XStream xStream = new XStream();
        // 自动检测所有类的注解
        xStream.autodetectAnnotations(true);
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
    }
}
  • 运行结果:
注解隐藏属性
  • 注意: 同样适用于JSON。

6)设置转换器

  • 语法格式: @XStreamOmitField
  • 演示代码:
// 实体类
class Person {
	@XStreamOmitField
	private String name;
	private int age;
	// 设置转换器,false为女,true为男
	@XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "男", "女" })
	private boolean sex;

	public Person(String name, int age, boolean sex) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 创建Person对象
        Person person = new Person("张三", 19);
        // 创建XStream对象
        XStream xStream = new XStream();
        // 自动检测所有类的注解
        xStream.autodetectAnnotations(true);
        // XML序列化(Person --> XML)
        String xml = xStream.toXML(person);
        System.out.println(xml);
        // XML反序列化(XML --> Person)
        Person person2 = (Person) xStream.fromXML(xml);
        System.out.println(person2);
    }
}
  • 运行结果:
设置转换器
  • 注意: 同样适用于JSON。

6、XStream持久化API(存储与读取XML)

1)保存JavaBean对象(存储到XML文件)

public static void main(String[] args) {
    // PersistenceStrategy是存储和读取XML的工具
    // 创建PersistenceStrategy对象,交生成的XML文件保存到 D:\tmp 中
    PersistenceStrategy strategy = new FilePersistenceStrategy(new File("D:\\tmp"));
    // XML集合(返回XmlArrayList)
    List list = new XmlArrayList(strategy);
    list.add(new Person("张三",13));//保存数据
    list.add(new Person("李四",21));
    list.add(new Person("王五",17));
}
保存JavaBean对象

2)读取并删除JavaBean对象

public static void main(String[] args) {
    // PersistenceStrategy是存储和读取XML的工具
    // 创建PersistenceStrategy对象,交生成的XML文件保存到 D:\tmp 中
    PersistenceStrategy strategy = new FilePersistenceStrategy(new File("D:\\tmp"));
    // XML集合(返回XmlArrayList)
    List list = new XmlArrayList(strategy);
    // 遍历List集合,并删除每一个元素
    ListIterator lit = list.listIterator();
    while (lit.hasNext()) {
        Person person = (Person) lit.next();
        System.out.println(person);
        lit.remove();
    }
}
读取并删除JavaBean对象


四、注意事项

  • 1、用 XStream 把 JavaBean转为XML 时,转换后的内容不包括 XML文件的头(需要手动添加):<?xml version='1.0' encoding='UTF-8'?>

  • 2、XStream 把 JavaBean转为XML 时,类名的节点会带包路径,如果不需要包路径,需要主动设置或者应用注解。 xStream.alias("door",Door.class);

  • 3、在 JavaBean中 添加的注解,需要在应用时进行注册,如需要用Door中的注解,则需要进行设置:

xStream.processAnnotations(Door.class);  // 应用Door类的注解
xStream.autodetectAnnotations(true);     // 自动检测注解

博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!



### 使用 XStream 在 Ant Design X 中处理 XML 数据 在 Ant Design X 的环境中引入并使用 XStream 可以帮助实现 Java 对象与 XML 字符串之间的转换。虽然 Ant Design X 主要关注于 UI 组件的设计和交互,但可以在应用程序逻辑层集成 XStream 来满足特定需求。 为了展示如何在基于 Ant Design X 的项目里利用 XStream 进行对象序列化到 XML 和反序列化的操作,下面给出一段简单的例子: 假设有一个 `User` 类表示用户信息,在前端应用中可能需要将此类实例转化为 XML 形式发送给服务器端或从服务器接收 XML 并解析回 `User` 实例。 #### 定义 User 类 (Java) ```java public class User { private String name; private int age; public User() {} public User(String name, int age) { this.name = name; this.age = age; } // Getters and Setters... } ``` #### 序列化 Java 对象为 XML 当准备向后端提交数据时,可以创建一个新的 `XStream` 实例来完成这个过程: ```java import com.thoughtworks.xstream.XStream; // 创建新的 XStream 实例 XStream xstream = new XStream(); // 配置别名(可选) xstream.alias("user", User.class); // 将 user 对象转成 xml 字符串 String xml = xstream.toXML(new User("John Doe", 30)); System.out.println(xml); ``` 这段代码会输出如下所示的 XML 结构[^1]: ```xml <user> <name>John Doe</name> <age>30</age> </user> ``` #### 解析 XML 到 Java 对象 如果从前端接收到上述格式的 XML 响应,则可以通过相同的方式将其还原为 `User` 对象: ```java // 接收来自网络或其他地方传入的 xml 文本 String receivedXml = "<user><name>John Doe</name><age>30</age></user>"; // 初始化 XStream 实例并设置别名映射关系 XStream xstream = new XStream(); xstream.alias("user", User.class); // 把 xml 转换成对应的 java bean User userFromXml = (User)xstream.fromXML(receivedXml); System.out.println(userFromXml.getName()); // 输出 John Doe System.out.println(userFromXml.getAge()); // 输出 30 ``` 需要注意的是,以上示例主要展示了核心概念和技术要点;实际部署时还需要考虑安全性、性能优化等因素,并遵循最佳实践指南。 尽管 Ant Design X 提供了许多用于构建现代 Web 用户界面的强大工具,但在某些情况下确实有必要借助像 XStream 这样的第三方库来进行更复杂的数据处理工作。不过要注意确保所选用的技术栈兼容并且不会引起冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小异常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值