Xstream学习笔记.docx
《Xstream学习笔记.docx》由会员分享,可在线阅读,更多相关《Xstream学习笔记.docx(31页珍藏版)》请在冰豆网上搜索。
Xstream学习笔记
Xstream操作Xml与Json
1.Xstream介绍1
(1)Xstream介绍1
(2)Xstream的简单例子1
2.Xstream的基本使用2
(1)Xstream序列化XML2
(2)Xstream序列化Json3
3.Xstream序列化重命名3
(1)为包重命名:
Xstream.aliasPackage()方法3
(2)为类重命名:
Xstream.alias()方法3
(3)为字段重命名:
Xstream.aliasField()方法4
(4)省略集合根节点:
Xstream.addImplicitCollection()方法4
(5)把字段节点设置成属性:
Xstream.useAttributeFor()方法5
(6)隐藏字段:
xstream.omitField()方法5
4.Xstream注解的使用6
(1)设置Xstream应用注解6
(2)重命名注解:
@XStreamAlias()6
(3)省略集合根节点:
@XStreamImplicit7
(4)把字段节点设置成属性:
@XStreamAsAttribute7
(5)隐藏字段:
@XStreamOmitField8
(6)设置转换器:
@XStreamConverter()8
5.Xstream自定义的转换器8
(1)Xstream自带的转换器8
(2)使用自定义的转换器8
(3)常用的转换器接口与抽象类10
6.Xstream对象流的使用10
(1)Xstream对象输出流10
(2)Xstream对象输出流11
7.Xstream持久化API11
(1)保存JavaBean对象11
(2)读取并删除JavaBean对象12
8.Xstream操作Json12
(1)Xstream序列化Json的重命名12
(2)去掉序列化Json的根节点13
(3)Json的解析器区别14
作者:
李志伟
时间:
2014-06-30
1.Xstream介绍
(1)Xstream介绍
Xstream是一种OXMapping技术,是用来处理XML文件序列化的框架,在将JavaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。
Xstream也可以将JavaBean序列化成Json或反序列化,使用非常方便。
(2)Xstream的简单例子
classPerson//JavaBean实体类
{
privateStringname;
privateintage;
publicPerson(Stringname,intage)
{
this.name=name;
this.age=age;
}
@Override
publicStringtoString()
{
return"Person[name="+name+",age="+age+"]";
}
}
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
XStreamxstream=newXStream();
//XML序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//XML反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
xstream=newXStream(newJettisonMappedXmlDriver());
xstream.setMode(XStream.NO_REFERENCES);
//Json序列化
Stringjson=xstream.toXML(bean);
System.out.println(json);
//Json反序列
bean=(Person)xstream.fromXML(json);
System.out.println(bean);
}
}
程序运行结果:
张三
19
Person[name=张三,age=19]
{"test.Person":
{"name":
"张三","age":
19}}
Person[name=张三,age=19
注意:
Xstream序列化XML时需要引用的jar包:
xstream-[version].jar、xpp3-[version].jar、xmlpull-[version].jar。
Xstream序列化Json需要引用的jar包:
jettison-[version].jar。
使用Xstream序列化时,对JavaBean没有任何限制。
JavaBean的字段可以是私有的,也可以没有getter或setter方法,还可以没有默认的构造函数。
2.Xstream的基本使用
(1)Xstream序列化XML
Xstream序列化XML时可以允许用户使用不同的XML解析器,用户可以使用一个标准的JAXPDOM解析器或自Java6集成StAX解析器。
这样用户就不需要依赖xpp3-[version].jar。
Xstream序列化XML时,也可以对XML节点重命名。
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
//XStreamxstream=newXStream();//需要XPP3库
//XStreamxstream=newXStream(newDomDriver());//不需要XPP3库
XStreamxstream=newXStream(newStaxDriver());//不需要XPP3库开始使用Java6
xstream.alias("人",Person.class);//为类名节点重命名
//XML序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//XML反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
xmlversion="1.0"?
><人>张三19人>
Person[name=张三,age=19]
(2)Xstream序列化Json
Xstream序列化Json与序列化XML类似,例如:
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
XStreamxstream=newXStream(newJettisonMappedXmlDriver());//设置Json解析器
xstream.setMode(XStream.NO_REFERENCES);//设置reference模型,不引用
xstream.alias("人",Person.class);//为类名节点重命名
//Json序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//Json反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
{"人":
{"name":
"张三","age":
19}}
Person[name=张三,age=19]
3.Xstream序列化重命名
(1)为包重命名:
Xstream.aliasPackage()方法
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
XStreamxstream=newXStream();
xstream.aliasPackage("com.lzw","test");//为包名称重命名
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
张三
19
Person[name=张三,age=19]
(2)为类重命名:
Xstream.alias()方法
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
XStreamxstream=newXStream();
xstream.alias("人",Person.class);//为类名节点重命名
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
<人>
张三
19
人>
Person[name=张三,age=19]
(3)为字段重命名:
Xstream.aliasField()方法
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19);
XStreamxstream=newXStream();
xstream.aliasField("姓名",Person.class,"name");//为类的字段节点重命名
xstream.aliasField("年龄",Person.class,"age");//为类的字段节点重命名
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
<姓名>张三姓名>
<年龄>19年龄>
Person[name=张三,age=19]
(4)省略集合根节点:
Xstream.addImplicitCollection()方法
classPerson
{
privateStringname;
privateintage;
privateListfriends;
publicPerson(Stringname,intage,String...friends)
{
this.name=name;
this.age=age;
this.friends=Arrays.asList(friends);
}
@Override
publicStringtoString()
{
return"Person[name="+name+",age="+age+",friends="+friends+"]";
}
}
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19,"李四","王五","赵六");
XStreamxstream=newXStream();
xstream.addImplicitCollection(Person.class,"friends");//省略集合根节点
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
张三
19
李四
王五
赵六
Person[name=张三,age=19,friends=[李四,王五,赵六]]
(5)把字段节点设置成属性:
Xstream.useAttributeFor()方法
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19,"李四","王五","赵六");
XStreamxstream=newXStream();
xstream.useAttributeFor(Person.class,"name");//把字段节点设置成属性
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
19
李四
王五
赵六
Person[name=张三,age=19,friends=[李四,王五,赵六]]
(6)隐藏字段:
xstream.omitField()方法
publicclassTest
{
publicstaticvoidmain(String[]args)
{
Personbean=newPerson("张三",19,"李四","王五","赵六");
XStreamxstream=newXStream();
xstream.omitField(Person.class,"friends");//把字段节点隐藏
//序列化
Stringxml=xstream.toXML(bean);
System.out.println(xml);
//反序列化
bean=(Person)xstream.fromXML(xml);
System.out.println(bean);
}
}
程序运行结果:
张三
19
Person[name=张三,age=19,friends=null]
4.Xstream注解的使用
(1)设置Xstream应用注解
使用Xstream注解前需要对Xstream进行配置,可以使用两种方式:
应用某个JavaBean类的注解或自动使用JavaBean类的注解。
代码如下:
XStreamxstream=newXStream();
xstream.processAnnotations(Person.class);//应用Person类的注解
xstream.autodetectAnnotations(true);//自动检测注解
(2)重命名注解:
@XStreamAlias()
@XStreamAlias("人")
classPerson
{
@XStreamAlias("姓名")
privateStringname;
@XStreamAlias("年龄")
privateintage;
@XStreamAlias("朋友")
privateListfriends;
publicPerson(Stringname,intage,String...friends)
{
this.name=name;
this.age=age;
this.friends=Arrays.asList(friends);
}
@Override
publicStringtoString()
{
return"Person[name="+name+",age="+age+",friends="+friends+"]";
}
}
程序运行结果:
<人>
<姓名>张三姓名>
<年龄>19年龄>
<朋友class="java.util.Arrays$ArrayList">
李四
王五
赵六
朋友>
人>
Person[name=张三,age=19,friends=[李四,王五,赵六]]
(3)省略集合根节点:
@XStreamImplicit
classPerson
{
privateStringname;
privateintage;
//@XStreamImplicit//只隐藏集合根节点
@XStreamImplicit(itemFieldName="朋友")//设置重复的节点名,可能会导致无法反序列化
privateListfriends;
publicPerson(Stringname,intage,String...friends)
{
this.name=name;
this.age=age;
this.friends=Arrays.asList(friends);
}
@Override
publicStringtoString()
{
return"Person[name="+name+",age="+age+",friends="+friends+"]";
}
}
程序运行结果:
张三
19
<朋友>李四朋友>
<朋友>王五朋友>
<朋友>赵六朋友>
Person[name=张三,age=19,friends=[李四,王五,赵六]]
(4)把字段节点设置成属性:
@XStreamAsAttribute
classPerson
{
@XStreamAsAttribute
privateStringname;
@XStreamAsAttribute
privateintage;
privateListfriends;
publicPerson(Stringname,intage,String...friends)
{
this.name=name;
this.age=age;
this.friends=Arrays.asList(friends);
}
@Override
publicStringtoString()
{
return"Person[name="+name+",age="+age+",friends="+friends+"]";
}
}
程序运行结果:
李四
王五
赵六
Person[name=张三,age=19,friends=[李四,王五,赵六]]
(5)隐藏字段:
@XStreamOmitField
classPerson
{
privateStringname;
privateintage;
@XStreamOmitField
privateListfriends;
publicPerson(Stringname,intage,String...friends)
{
this.name=name;
this.age=age;
this.friends=Arrays.asList(friends);
}
@Override
publicString