XStream使用文档第1页共33页XStream使用文档作者:胡少锋Email:hsf@21cn.com2011年11月XStream使用文档第2页共33页1基本介绍1.1前言XStream是一个轻量级的、简单易用的开放源代码Java库,用于将Java对象序列化为XML或者再转换回来。而且XStream还能将java对象转成其它格式,比如JSon。官方上的XStream特点:使用简单不需要配置映射速度快,占用内存小生成的XML文件简洁不需要修改序列化对象的类型支持类嵌套详细的错误日志可转成其它格式XStream相比其它框架有如下的优点:XStream不关心序列化/逆序列化的类的字段的可见性。序列化/逆序列化类的字段不需要getter和setter方法。序列化/逆序列化的类不需要有默认构造函数。2安装和使用2.1下载XStream的网站http://xstream.codehaus.org/download.html上面可以下载到各种版本。目前用最新版本是1.4.1,下载这个版本即可。XStream使用文档第3页共33页2.2安装XStream的安装方法比较简单,将xstream-1.4.1.jar以及kxml2-2.3.0.jar放置到类路径下面即可使用。如下图所示:3开始一个例子3.1新建一个空的javaproject工程通过eclipse向导新建一个JavaProject工程,并将上面提的两个类添加到类路径下。工程如下:3.2编写Java后台类,代码如下新建一个cn的package,然后在cn下面新建两个Java类,Person和PhoneNumber,代码分别如下:Person.javapackagecn;publicclassPerson{XStream使用文档第4页共33页privateStringfirstname;privateStringlastname;privatePhoneNumberphone;privatePhoneNumberfax;publicPerson(StringfirstName,StringlastName){this.firstname=firstName;this.lastname=lastName;}publicStringgetFirstname(){returnfirstname;}publicvoidsetFirstname(Stringfirstname){this.firstname=firstname;}publicStringgetLastname(){returnlastname;}publicvoidsetLastname(Stringlastname){this.lastname=lastname;}publicPhoneNumbergetPhone(){returnphone;}publicvoidsetPhone(PhoneNumberphone){this.phone=phone;}XStream使用文档第5页共33页publicPhoneNumbergetFax(){returnfax;}publicvoidsetFax(PhoneNumberfax){this.fax=fax;}}PhoneNumber.javapackagecn;publicclassPhoneNumber{privateintcode;privateStringnumber;publicPhoneNumber(intcode,Stringnumber){this.code=code;this.number=number;}publicintgetCode(){returncode;}publicvoidsetCode(intcode){this.code=code;}publicStringgetNumber(){returnnumber;}publicvoidsetNumber(Stringnumber){XStream使用文档第6页共33页this.number=number;}}以上是两个很普通的Java对象。下面将写测试代码,将一个Person对象转成xml;然后再从xml转成Java对象。在cn包下面建立一个Main.java,代码如下:packagecn;importcom.thoughtworks.xstream.XStream;publicclassMain{/***@paramargs*/publicstaticvoidmain(String[]args){XStreamxstream=newXStream();xstream.alias(person,Person.class);xstream.alias(phonenumber,PhoneNumber.class);Personjoe=newPerson(Joe,Walnes);joe.setPhone(newPhoneNumber(123,1234-456));joe.setFax(newPhoneNumber(123,9999-999));Stringxml=xstream.toXML(joe);System.out.println(xml);PersonnewJoe=(Person)xstream.fromXML(xml);System.out.println(newJoe.getFirstname());}}XStream使用文档第7页共33页3.3运行测试类运行上面的Main.java类,输出结果如下:3.4代码解析下面主要对Main.java中的main方法进行详细地解析.XStreamxstream=newXStream();直接实例化一个XStream对象,不用任何参数。这个时候XSteam内部会使用KXml2的解析工具。也就是上面添加的kxml2-2.3.0.jar包。如果不需要使用这个包的话,可以用JAXP的包等。例如:XStreamxstream=newXStream(newDomDriver());XStreamxstream=newXStream(newStaxDriver());继续下面的代码:xstream.alias(person,Person.class);xstream.alias(phonenumber,PhoneNumber.class);这两句表示对于xml中的每个结点,所映射的Java类。也就是person结点映射到了Person类;而phonenumber则映射到了PhoneNumber类。下面是实例化对象之类的,比较简单,我们跳过去不将。直接进入:Stringxml=xstream.toXML(joe);这个就是核心所在,即将一个java对象转成了xml。XStream使用文档第8页共33页继续下面的代码:PersonnewJoe=(Person)xstream.fromXML(xml);这个也是核心所在,将一个xml转成java对象。4Alias机制XStream的Alias功能是很强大的,也是XStream开发中不可或缺的一个重点功能,下面将通过一些实例来讲解如何应用Alias机制4.1默认情况,不使用Alias4.1.1新建相关的java对象类分别新建下面的类packagecom.thoughtworks.xstream;importjava.util.ArrayList;importjava.util.List;publicclassBlog{privateAuthorwriter;privateListentries=newArrayList();publicBlog(Authorwriter){this.writer=writer;}publicvoidadd(Entryentry){entries.add(entry);}publicListgetContent(){returnentries;}}XStream使用文档第9页共33页packagecom.thoughtworks.xstream;publicclassAuthor{privateStringname;publicAuthor(Stringname){this.name=name;}publicStringgetName(){returnname;}}packagecom.thoughtworks.xstream;publicclassEntry{privateStringtitle;privateStringdescription;publicEntry(Stringtitle,Stringdescription){this.title=title;this.description=description;}}4.1.2建立测试代码如下:packagecom.thoughtworks.xstream;publicclassMain{XStream使用文档第10页共33页publicstaticvoidmain(String[]args){BlogteamBlog=newBlog(newAuthor(GuilhermeSilveira));teamBlog.add(newEntry(first,Myfirstblogentry.));teamBlog.add(newEntry(tutorial,Todaywehavedevelopedanicealiastutorial.Tellyourfriends!NOW!));XStreamxstream=newXStream();System.out.println(xstream.toXML(teamBlog));}}运行这个主函数,输出结果如下:com.thoughtworks.xstream.BlogwriternameGuilhermeSilveira/name/writerentriescom.thoughtworks.xstream.Entrytitlefirst/titledescriptionMyfirstblogentry./description/com.thoughtworks.xstream.Entrycom.thoughtworks.xstream.Entrytitletutorial/titledescriptionTodaywehavedevelopedanicealiastutorial.Tellyourfriends!NOW!/description/com.thoughtworks.xstream.Entry/entries/com.thoughtworks.xstream.BlogXStream使用文档第11页共33页4.1.3分析从这个例子看到,如果没有使用任何Alias的话,输出的XML中包含了类的全路径,包含package和class的名称。这一般来说,不是我们想要的结果,可能我们想要的结果是如下:blogwriternameGuilhermeSilveira/name/writerentriesentrytitlefirst/titledescriptionMyfirstblogentry./description/entryentrytitletutorial/titledescriptionTodaywehavedevelopedanicealiastutorial.Tellyourfriends!NOW!/description/entry/entries/blog4.2对class进行alias修改上面的主函数,增加alias,如下:publicstaticvoidmain(String[]args){BlogteamBlog=newBlog(newAuthor(GuilhermeSilvei