Java --- Xstream使用

Java --- Xstream

Xstream提供了Java对象和XML格式, JSON格式转换的支持。

Xml支持

基本使用

简单实用示例

        TestBean tb = new TestBean();

       tb.setId(1L);

       tb.setAge(20);

       tb.setUserName("张三");

       XStream xStream = new XStream();

       String xmlStrxStream.toXML(tb);

       System.out.println(xmlStr);

      

       TestBean tb2 = (TestBean) xStream.fromXML(xmlStr);

       System.out.println(tb2.getId());

       System.out.println(tb2.getAge());

       System.out.println(tb2.getUserName());

      

TestBean:

    protectedlongId;

    protected String userName;

    protectedintage;

<com.lh.example.xstream.TestBean>

  <Id>1</Id>

  <userName>张三</userName>

  <age>20</age>

</com.lh.example.xstream.TestBean>

1

20

张三

 

从示例中可见不用做任何的配置就可以简单获取Xstream对象来进行XML和Java对象的互相转换。从输出看到xml的根节点是类的完整类名,而节点名称是域名。

 

如果我们想要定义自己的节点名称可以使用Xstream类的aliasXXX方法:

alias(String, Class)  

aliasType(String, Class)

alias(String, Class, Class)

aliasPackage(String, String)

aliasField(String, Class, String)

aliasAttribute(String, String)

aliasSystemAttribute(String, String)

aliasAttribute(Class, String, String)

比如:

XStream xStream = new XStream();

       xStream.aliasType("User", TestBean.class);

       xStream.aliasField("用户名", TestBean.class, "userName");;

<User>

  <Id>1</Id>

  <用户名>张三</用户名>

  <age>20</age>

</User>

 

List,Map,Array,Instance 域:

上面例子显示了String和简单类型生成的xml格式,下面展示下List, Map, Array, 类实例的xml格式

    protected List<String> friendNames;

    protected String[] shcools;

    protected Property property;

    protected Map<String, String> testMap;

<User>

  <Id>1</Id>

  <用户名>张三</用户名>

  <age>20</age>

  <friendNames>

    <string>person a</string>

    <string>person b</string>

    <string>person c</string>

  </friendNames>

  <shcools>

    <string>A SCHOOL</string>

    <string>B SCHOOL</string>

  </shcools>

  <property>

    <name>watch</name>

    <value>1000</value>

  </property>

  <testMap>

    <entry>

      <string>keyA</string>

      <string>ValueA</string>

    </entry>

    <entry>

      <string>keyB</string>

      <string>ValueB</string>

    </entry>

  </testMap>

</User>

 

 

忽略某个属性

       xStream.omitField(TestBean.class, "age");

 

Converter

通过添加类型转换定制对特定类型的值是如何输出的。

 

下面是java.util.Date类型的默认输出:

          <date>2015-10-14 07:06:08.162 UTC</date>

我们可以通过添加该类型的转换器,将其输出格式改变为:20151014150000.

实现方法为实现com.thoughtworks.xstream.converters.Converter或 SingleValueConverter接口,并注册到需要使用到该转换器的类型上Xstream提供了所有很多抽象基类类帮助我们简化对转换器的编写的编写,我们将使用到类AbstractSingleValueConverter。

 

publicclass DateConverter extends AbstractSingleValueConverter{

 

    publicfinal SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HHmmss");

    @Override

    publicboolean canConvert(Class arg0) {

       returnarg0.equals(Date.class);

    }

 

    @Override

    public Object fromString(String arg0) {

       try {

           returnsdf.parse(arg0);

       } catch (ParseException e) {

           e.printStackTrace();

       }

       returnnull;

    }

 

    public String toString(Object object){

       returnsdf.format((Date)object);

    }

}

注册:   xStream.registerConverter(new DateConverter());

输出:   <date>20151014 152633</date>

 

注解支持

         一种替换通过xStream设置大量别名的方法是使用注解。注解包括:

com.thoughtworks.xstream.annotations.XStreamAlias.class

com.thoughtworks.xstream.annotations.XStreamAliasType.class

com.thoughtworks.xstream.annotations.XStreamAsAttribute.class

com.thoughtworks.xstream.annotations.XStreamContainedType.class

com.thoughtworks.xstream.annotations.XStreamConverter.class

com.thoughtworks.xstream.annotations.XStreamConverters.class

com.thoughtworks.xstream.annotations.XStreamImplicit.class

com.thoughtworks.xstream.annotations.XStreamImplicitCollection.class

com.thoughtworks.xstream.annotations.XStreamInclude.class

com.thoughtworks.xstream.annotations.XStreamOmitField.class

        

         使用示例:

        

@XStreamAlias("用户")

publicclass TestBean {

    @XStreamOmitField

    protectedlongId;

   

    protected String userName;

    @XStreamAsAttribute

    protectedintage;

    @XStreamConverter(DateConverter.class)

    protected Date date;

    @XStreamImplicit

    protected List<String> friendNames;

       XStream xStream = new XStream();

       xStream.autodetectAnnotations(true);

 

Json

         前面提到,Xstream也至此Json。其实现依赖Jettison。

        

       XStream xStream = new XStream(new JettisonMappedXmlDriver());

 

{"用户":{"@age":"20","userName":"张三","date":"20151016 150028","string":["person a","person b","person c","A SCHOOL","B SCHOOL"]},"property":{"name":"watch","value":1000},"testMap":{"entry":[{"string":["keyA","ValueA"]},{"string":["keyB","ValueB"]}]}}

 

 

Xstream只是装饰器

         从Json的支持中可以看出和xml在API的使用上没有任何的区别,只是指定了一个JettitionMappedXmlDriver。

Xstream并不仅仅一个具体的XML,JSON工具,从Xstream的源码中可以查看出Xstream

其实是一个Java 类序列化的通用框架,具体的序列化实现则是可以使用不同的第三方实现,如Dom4j, Jdom,当然也就要使用引用第三方的Jar包,比如Json的使用。

         在创建Xstream实例时通过提供一个HierarchicalStreamDriver来对流进行不同的处理。

         com.thoughtworks.xstream.io.HierarchicalStreamDriver

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(Reader)

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(InputStream)

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(URL)

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createReader(File)

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createWriter(Writer)

com.thoughtworks.xstream.io.HierarchicalStreamDriver.createWriter(OutputStream)

从方法列表中可以看出,HierarchicalStreamDriver其实是流的Reader和Writer的创建工厂。

Dom4JDriver

使用Dom4j SAXReader方式来解析XML,使用Dom4j提供的XMLWriter类

DomDriver

使用JDK xml api

Jdom

使用JDOM

XomDriver

使用Xom对象模型

BEAStaxDriver

使用BEA Stax实现

StandardStaxDriver

使用JDK的 STAX实现

WstxDriver

使用Woodstox STAX实现。

KXml2Driver

使用KXML2解析器

Xpp3Driver

使用Xpp3解析器

XppDriver

使用Xpp解析器

KXml2DomDriver

使用KMX2的XPP DOM解析器

Xpp3DomDriver

使用Xpp3的 XPP DOM解析器

XppDomDriver

使用Xpp的XPP DOM解析器

Jdom2Driver

使用JDOM2

JettisonMapppedXmlDriver

使用Jettison进行Json操作

JsonHierachicalStreamDriver

Xstream自带的一个JSON操作工具,有更优化的Json格式,但是不支持去序列化

BinaryStreamDriver

Xstream自带的针对二进制流的序列化和反序列化工具。文档中标准了没有Java序列化紧凑

Xstream默认使用XppDriver.

 

注2:XPP XML FULL PARSER

注1:@引用1

         XL的API无外乎是以下两种:

 

    基于树的API- 整个文档以树的形式被读入内存,可以被调用程序随机访问。

    基于事件的API - 应用注册接收事件,当原XML文档遇到事体时就会产生这些事件。

 

两者皆有优点,前者(例如DOM)允许对文档进行随机访问,而后者(例如SAX)需要较小的内存开销,并却通常更快。

这两个方法可以认为是正好相反。基于树的API允许无限制的,随机的访问和操纵,而基于事件的API是一次性地遍历源文档。

StAX被设计为这两者的一个折中。在StAX中,程序的切入点是表示XML文档中一个位置的光标。应用程序在需要时向前移动光标,从解析器拉出信息。与基于事件的API(如SAX)将“数据推送”给应用程序不同的是,SAX需要应用程序维持时间间的状态,以保持文档内的位置信息。

Xstream不能做什么

         从Xstream的API可以看出,XSTREAM专注的是对象和序列化结果的转换,其是建立在各种各样的xml解析器和类反射机制,或则注解的基础上的,本质是一个装饰器。

         适配的结果是统一,简单的API,那相对于直接使用xml解析器,它不能做的就是任何操作待编辑额

 

@引用1:引用自百度百科 STAX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值