版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://blog.csdn.net/sun8112133/article/details/90482307
文章目录
一、XStream概述二、Hello XStream(简单例子)1、实体类(Person类)2、测试类(Test类)3、程序运行结果
三、XStream使用1、XStream序列化重命名1)为包重命名2)为类重命名3)为字段重命名
2、省略集合根节点3、把字段节点设置成属性4、隐藏字段5、XStream注解的使用1)设置XStream应用注解A. 自动检测指定类的注解B. 自动检测所有类的注解
2)重命名注解(类、字段)3)省略集合根节点4)把字段节点设置成属性5)隐藏字段6)设置转换器
6、XStream持久化API(存储与读取XML)1)保存JavaBean对象(存储到XML文件)2)读取并删除JavaBean对象
四、注意事项
一、XStream概述
XStream 是一种 OXMapping 技术(Object XML Mapping,对象XML映射技术),是用来处理XML文件序列化的框架,在将 JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。XStream也可以将 JavaBean序列化 成 JSON 或反序列化,使用非常方便。 说白了就是:将XML转为JavaBean,或将JavaBean转为XML,也可以转JSON。
所需Jar包
XStream不需要在配置文件中进行额外配置,只需要往工程中导入Jar包即可,以下是我使用的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
= new Person("张三", 19);
XStream xStream
= new XStream();
System
.out
.println("XML序列化与反序列化:");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
System
.out
.println();
System
.out
.println("JSON序列化与反序列化:");
xStream
= new XStream(new JettisonMappedXmlDriver());
String json
= xStream
.toXML(person
);
System
.out
.println(json
);
Person person3
= (Person
) xStream
.fromXML(json
);
System
.out
.println(person3
);
}
}
3、程序运行结果
三、XStream使用
1、XStream序列化重命名
1)为包重命名
语法格式: aliasPackage(别名, 原包名);演示代码:
public static void main(String
[] args
) {
Person person
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.aliasPackage("new.bean", "com.bean");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
运行结果:
注意: 同样适用于JSON。
2)为类重命名
语法格式: alias(别名, 类的字节码对象);演示代码:
public static void main(String
[] args
) {
Person person
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.alias("人", Person
.class);
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
运行结果:
注意: 同样适用于JSON。
3)为字段重命名
语法格式: aliasField(别名, 类的字节码对象, 原字段名);演示代码:
public static void main(String
[] args
) {
Person person
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.aliasField("姓名", Person
.class, "name");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
运行结果:
注意: 同样适用于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
= new Person("张三", 19, Arrays
.asList("李四", "王五", "周七"));
XStream xStream
= new XStream();
xStream
.addImplicitCollection(Person
.class, "friends");
System
.out
.println("XML序列化与反序列化:");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
}
运行结果:
注意: 同样适用于JSON。
3、把字段节点设置成属性
语法格式: useAttributeFor(类的字节码对象, 字段名);演示代码:
public static void main(String
[] args
) {
Person person
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.useAttributeFor(Person
.class, "name");
System
.out
.println("XML序列化与反序列化:");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
System
.out
.println();
System
.out
.println("JSON序列化与反序列化:");
xStream
= new XStream(new JettisonMappedXmlDriver());
xStream
.useAttributeFor(Person
.class, "name");
String json
= xStream
.toXML(person
);
System
.out
.println(json
);
Person person3
= (Person
) xStream
.fromXML(json
);
System
.out
.println(person3
);
}
运行结果:
注意: 同样适用于JSON。
4、隐藏字段
语法格式: omitField(类的字节码对象, 字段名);演示代码:
public static void main(String
[] args
) {
Person person
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.omitField(Person
.class, "name");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
运行结果:
注意: 同样适用于JSON。
5、XStream注解的使用
1)设置XStream应用注解
使用 XStream注解 前需要对 XStream 进行配置,可以使用两种方式:
检测某个 JavaBean类 的注解自动检测所有 JavaBean类 的注解。
A. 自动检测指定类的注解
XStream xStream
= new XStream();
xStream
.processAnnotations(Person
.class);
B. 自动检测所有类的注解
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
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.autodetectAnnotations(true);
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
}
运行结果:
注意: 同样适用于JSON。
3)省略集合根节点
语法格式: @XStreamImplicit演示代码:
class Person {
private String name
;
private int age
;
@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
= new Person("张三", 19, Arrays
.asList("李四", "王五", "周七"));
XStream xStream
= new XStream();
xStream
.autodetectAnnotations(true);
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
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
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.autodetectAnnotations(true);
System
.out
.println("XML序列化与反序列化:");
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
System
.out
.println();
System
.out
.println("JSON序列化与反序列化:");
xStream
= new XStream(new JettisonMappedXmlDriver());
xStream
.autodetectAnnotations(true);
String json
= xStream
.toXML(person
);
System
.out
.println(json
);
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
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.autodetectAnnotations(true);
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
Person person2
= (Person
) xStream
.fromXML(xml
);
System
.out
.println(person2
);
}
}
运行结果:
注意: 同样适用于JSON。
6)设置转换器
语法格式: @XStreamOmitField演示代码:
class Person {
@XStreamOmitField
private String name
;
private int age
;
@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
= new Person("张三", 19);
XStream xStream
= new XStream();
xStream
.autodetectAnnotations(true);
String xml
= xStream
.toXML(person
);
System
.out
.println(xml
);
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 strategy
= new FilePersistenceStrategy(new File("D:\\tmp"));
List list
= new XmlArrayList(strategy
);
list
.add(new Person("张三",13));
list
.add(new Person("李四",21));
list
.add(new Person("王五",17));
}
2)读取并删除JavaBean对象
public static void main(String
[] args
) {
PersistenceStrategy strategy
= new FilePersistenceStrategy(new File("D:\\tmp"));
List list
= new XmlArrayList(strategy
);
ListIterator lit
= list
.listIterator();
while (lit
.hasNext()) {
Person person
= (Person
) lit
.next();
System
.out
.println(person
);
lit
.remove();
}
}
四、注意事项
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);
xStream
.autodetectAnnotations(true);
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!