Xstream提供了Java对象和XML格式, JSON格式转换的支持。
简单实用示例
TestBean tb = new TestBean(); tb.setId(1L); tb.setAge(20); tb.setUserName("张三"); XStream xStream = new XStream(); String xmlStr = xStream.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; |
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");; |
<用户名>张三用户名>
|
上面例子显示了String和简单类型生成的xml格式,下面展示下List, Map, Array, 类实例的xml格式
protected List protected String[] shcools; protected Property property; protected Map |
<用户名>张三用户名>
|
xStream.omitField(TestBean.class, "age"); |
通过添加类型转换定制对特定类型的值是如何输出的。
下面是java.util.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()); |
输出: |
一种替换通过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 |
XStream xStream = new XStream(); xStream.autodetectAnnotations(true); |
前面提到,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"]}]}}
|
从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的API可以看出,XSTREAM专注的是对象和序列化结果的转换,其是建立在各种各样的xml解析器和类反射机制,或则注解的基础上的,本质是一个装饰器。
适配的结果是统一,简单的API,那相对于直接使用xml解析器,它不能做的就是任何操作待编辑额
@引用1:引用自百度百科 STAX