目录
简介
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());