JAVA:Spring Boot 集成 XStream 实现对象与XML转换

admin
0
2026-03-17

1、简述

XStream 是一个简单便捷的 Java 库,用于对象与 XML 的相互转换。其主要特点是:

🔥 易于使用:无需复杂的配置即可直接使用。

🔥 支持自定义:可以灵活地定制对象的序列化和反序列化规则。

🔥 强大的功能:支持注解、自定义转换器等。

本文将详细介绍 XStream 的基本使用方法,并通过一些实践样例来展示其强大之处。

image-zpdq.png


2、引入依赖

在使用 XStream 前,需要在项目中引入其依赖。如果使用 Maven,可以添加以下依赖:

<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.20</version>
</dependency>

如果使用 Gradle,则添加以下内容:

implementation 'com.thoughtworks.xstream:xstream:1.4.20'

3、基本用法

3.1 对象转 XML

以下是一个简单的示例,将一个 Java 对象转换为 XML:

import com.thoughtworks.xstream.XStream;

public class Main {
    public static void main(String[] args) {
        XStream xstream = new XStream();

        // 创建对象
        Person person = new Person("John", 30);

        // 将对象转为 XML
        String xml = xstream.toXML(person);
        System.out.println(xml);
    }
}

class Person {
    private String name;
    private int age;

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

    // Getters and Setters
}

运行结果:

<person>
  <name>John</name>
  <age>30</age>
</person>

3.2 XML 转对象

以下是从 XML 转换为对象的示例:

import com.thoughtworks.xstream.XStream;

public class ConverterXmlExample {
    public static void main(String[] args) {
        XStream xstream = new XStream();

        // 安全设置:允许反序列化的类
        XStream.setupDefaultSecurity(xstream);
        xstream.allowTypes(new Class[] {Person.class});

        // 或者使用通配符,允许指定包下的类
        xstream.allowTypesByWildcard(new String[] {"com.lm.xstream.ele.**"});

        // XML 字符串
        String xml = "<person> <name>John</name> <age>30</age> </person> ";

        // XML 转对象
        xstream.alias("person", Person.class); // 设置别名
        Person person = (Person) xstream.fromXML(xml);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}

class Person {
    private String name;
    private int age;

    public Person() {}

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

    // Getters and Setters
    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;
    }
}

运行结果:

Name: John
Age: 30

4、高级用法

4.1 使用注解

XStream 支持使用注解来定义 XML 与对象的映射关系。

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("person")
class Person {
    @XStreamAlias("full_name")
    private String name;

    @XStreamAlias("years_old")
    private int age;

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

    // Getters and Setters
}

public class Main {
    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.processAnnotations(Person.class); // 启用注解处理

        // 创建对象
        Person person = new Person("John", 30);

        // 对象转 XML
        String xml = xstream.toXML(person);
        System.out.println(xml);
    }
}

运行结果:

<person>
  <full_name>John</full_name>
  <years_old>30</years_old>
</person>

4.2 自定义转换器

可以通过自定义转换器来灵活地控制序列化和反序列化过程。

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

class PersonConverter implements Converter {
       @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        Person2 person = (Person2) source;
        writer.startNode("name");
        writer.setValue(person.getName());
        writer.endNode();

        writer.startNode("age");
        writer.setValue(String.valueOf(person.getAge()));
        writer.endNode();
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        String name = null;
        int age = 0;

        while (reader.hasMoreChildren()) {
            reader.moveDown();
            String nodeName = reader.getNodeName();
            if ("name".equals(nodeName)) {
                name = reader.getValue();
            } else if ("age".equals(nodeName)) {
                age = Integer.parseInt(reader.getValue());
            }
            reader.moveUp();
        }

        return new Person2(name, age);
    }

    @Override
    public boolean canConvert(Class aClass) {
        return Person2.class.isAssignableFrom(aClass);
    }
}

public class ConverterExample {
    public static void main(String[] args) {
        XStream xstream = new XStream();
        xstream.registerConverter(new PersonConverter());

        // 安全设置:允许反序列化的类
        XStream.setupDefaultSecurity(xstream);
        xstream.allowTypes(new Class[] {Person.class});

        // 或者使用通配符,允许指定包下的类
        xstream.allowTypesByWildcard(new String[] {"com.lm.xstream.ele.**"});

        // 创建对象
        Person2 person = new Person2("John", 30);

        // 对象转 XML
        String xml = xstream.toXML(person);
        System.out.println(xml);

        // XML 转对象
        Person2 newPerson = (Person2) xstream.fromXML(xml);
        System.out.println("Name: " + newPerson.getName());
        System.out.println("Age: " + newPerson.getAge());
    }
}

运行结果:

<com.lm.xstream.ele.Person2>
  <name>John</name>
  <age>30</age>
</com.lm.xstream.ele.Person2>
Name: John
Age: 30

5、总结

XStream 是一个功能强大且灵活的工具,可以轻松实现 Java 对象与 XML 之间的转换。通过本文的讲解和示例,相信你已经掌握了其基本用法和一些高级功能。

在实际项目中,XStream 可应用于配置文件解析、数据传输格式转换等场景。如果需要更多高级功能,可以参考官方文档进行探索。

动物装饰