目录

简介

创建 XStream 实例

将对象转成XML,将XML转成对象

标签操作&注册转换器

XStream转换器示例

XStream转化为JSON示例

注解实现示例


简介

Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。Xstream也可以将JavaBean序列化成Json或反序列化,使用非常方便。

创建 XStream 实例

当创建 XStream 实例时,可以传入不同的参数来配置 XStream 的行为和特性。

1.默认构造函数

XStream xstream = new XStream();

这将创建一个默认配置的 XStream 实例,可以直接用于对象和 XML 之间的转换。 

2.使用指定类加载器

XStream xstream = new XStream(new StaxDriver());

可以传入一个自定义的类加载器,用于加载相关的类。 

3.使用不同的数据转换器

XStream xstream = new XStream(new DomDriver());

可以选择不同的数据转换器,如 DomDriver、StaxDriver、JDomDriver 等,用于控制 XML 数据的读写方式。 

4.设置模式

XStream xstream = new XStream(new XppDriver());
xstream.setMode(XStream.NO_REFERENCES);

可以通过 setMode() 方法设置不同的模式,如 NO_REFERENCES、ID_REFERENCES、HIERARCHICAL、SINGLE_NODE 等,用于处理对象之间的引用关系。

5.自定义类转换器和转换策略

XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
xstream.registerConverter(new CustomConverter());
xstream.alias("customAlias", YourClass.class);

可以注册自定义的类转换器(Converter)、设置别名(alias)、定义转换策略等,用于定制对象和 XML/JSON 之间的转换逻辑。 

6.设置类加载器

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
XStream xstream = new XStream(new XppDriver(), classLoader);

可以传入自定义的类加载器,用于解决类加载的问题。

将对象转成XML,将XML转成对象

import com.thoughtworks.xstream.XStream;

// 创建XStream实例
XStream xstream = new XStream();

// 将对象转换为XML
String xml = xstream.toXML(object);

// 将XML转换为对象
Object obj = xstream.fromXML(xml);

标签操作&注册转换器

// 自定义标签名
xstream.alias("customTagName", YourClass.class);

// 去掉集合标签
xstream.addImplicitCollection(YourClass.class, "fieldName");

// 忽略字段
xstream.omitField(YourClass.class, "fieldName");

// 生成属性,而非子标签
xstream.useAttributeFor(YourClass.class, "fieldName");

// 注册转换器
xstream.registerConverter(new YourCustomConverter());

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;

public class CustomConverter implements Converter {

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        // 实现对象到XML的转换逻辑
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        // 实现XML到对象的转换逻辑
        return null;
    }

    @Override
    public boolean canConvert(Class type) {
        // 指定需要转换的类
        return type.equals(YourClass.class);
    }
}

XStream转化为JSON示例

import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;

// 创建XStream实例,使用JSON格式
XStream xstream = new XStream(new JsonHierarchicalStreamDriver());

// 将对象转换为JSON字符串
String json = xstream.toXML(object);

注解实现示例

1.定义需要进行转换的类

public class Person {
    private String name;
    private int age;
    private List<String> hobbies;

    // 构造函数、Getter和Setter方法

    // 使用注解定义自定义标签名称
    @XStreamAlias("fullName")
    private String name;

    // 使用注解去掉集合标签
    @XStreamImplicit(itemFieldName = "hobby")
    private List<String> hobbies;

    // 使用注解忽略字段
    @XStreamOmitField
    private int age;

    // 使用注解生成属性
    @XStreamAsAttribute
    private String gender;
}

2.创建自定义转换器

public class PersonConverter implements Converter {

    @Override
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        Person person = (Person) source;
        
        // 自定义标签名称
        writer.startNode("name");
        writer.setValue(person.getName());
        writer.endNode();

        // 忽略字段
        // 年龄不进行序列化

        // 生成属性
        writer.addAttribute("gender", person.getGender());

        // 去掉集合标签
        for (String hobby : person.getHobbies()) {
            writer.startNode("hobby");
            writer.setValue(hobby);
            writer.endNode();
        }
    }

    @Override
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        // 反序列化逻辑
        return null;
    }

    @Override
    public boolean canConvert(Class type) {
        return type.equals(Person.class);
    }
}

3.创建XStream实例,并注册转换器

XStream xstream = new XStream();
xstream.registerConverter(new PersonConverter());
03-14 13:31