1.Xstream的特点:

这里直接引用Xstream官方的叙述:

灵活易用:在更高的层次上提供了简单、灵活、易用的统一接口,用户无需了解项目的底层细节

无需映射:大多数对象都能够在无需映射的情况下进行序列化与反序列化的操作

快速稳定:设计时力求达到的最重要的指标是解析速度快、占用内存少,以使之可以适用于大的对象处理或是对信息吞吐量要求高的系统

清晰易懂:项目採用reflection机制得到无冗余信息的XML文件。

所生成的XML文件较本地Java序列化产物更简洁,格式更清晰。更便于用户阅读

无需改动:全然序列化包含private和final类型在内的所有内部字段。

支持非公有类和内部类。类能够没有缺省的构造函数

易于集成:通过实现特定的接口,XStream能够直接与其他不论什么树型结构进行序列化与反序列化操作(而不不过XML格式)

灵活转换:转换策略是能够定制的,同意用户自己定义特殊类型的对象怎样以XML格式存储。

错误处理:因为XML资料不合法而造成异常时。会提供具体地诊断信息帮助处理问题。

 

2.初始化XStream类

说Xstream简单是由于它提供统一入口。主要类XStream用作全部项目的入口点。它将重要组件集成在一起。提供更简单易用的API操作。

我们能够使用下面的语句进行初始化操作:

XStreamxstream = new XStream();

默认情况下。XStream会採用Xpp3库,XPP3是一种执行效率很高的XML全解析实现。假设你不想依靠Xpp3库的话。也能够使用一个标准的JAXP DOM解析器,能够採用下面语句进行初始化:

//不使用XPP3库

XStreamxstream = new XStream(new DomDriver());

此xstream实例。为线程安全的,能够供多个线程进行调用。共享使用。參考 com.thoughtworks.xstream.io.xml包,会发现系统提供了多种标识解析器供我们选择,包含,DomDriver、 JDomDriver、StaxDriver等等。


前面提到了Xstream提供了对Json的支持,是由于Xstream内置了两个Driver:

1.JsonHierarchicalStreamDriver:不依赖其它类库。仅仅实现obj->JSON

2.JettisonMappedXmlDriver:依赖jettison类库,实现 JSON->obj or obj->JSON

 两种Driver在处理同样设置的Object时会得到不同的JSON串,JsonHierarchicalStreamDriver得到的串更简洁,确如官网所说。

JsonHierarchicalStreamDriver有个小问题——默认输出带格式的JSON串,结构中带空格、换行,而且没有提供修饰方式。

3.经常用法:

xStream.toXML(object):将对象转换成XML、Json。

xStream.toXML(obj, outputStream):将对象转换XML、Json并封装成输出流。

xStream.toXML(object, writer):将对象转换XML、Json并封成写入流。

xStream.fromXML():将XML、Json转换成对象,此方法接受File、InputStream、Reader、String、URL类型的參数。

xStream.alias("news", News. class):为指定类名创建别名。

xStream.useAttributeFor(News.class,"id"):将id设为 News的元素的属性。

xStream.aliasField("other", BookShelf. class,"remark"):改动节点名称,将BookShelf类中的remark节点名改动为other。

xStream.addImplicitCollection(BookShelf.class,"books"):去掉集体节点的父节点。

xStream.aliasAttribute("姓名","name"):改动属性的name。为姓名。

4.实例1:将对象转换成XML   
/**
* 将对象转换成Xml格式的字符串
* @param object 要转换成Xml的对象
* @return String:Xml格式的字符串
*/
public static String convertObject2Xml(Object object) {
xStream=new XStream();
xStream.alias("news", News.class);//改动元素名称
xStream.useAttributeFor(News.class, "id");//将id设为News的元素的属性
return xStream.toXML(object);
}


5.实例2:将XML象转换成对象
/**
* 将成Xml格式的字符串转换成Java对象
* @param inputStream 要转换成Java对象的inputStream
* @return String:Xml格式的字符串
*/
public static Object convertXml2Object(InputStream inputStream) {
xStream=new XStream();
xStream.alias("news", News.class);//改动元素名称
xStream.useAttributeFor(News.class, "id");//将id设为News的元素的属性
return xStream.fromXML(inputStream);//此方法也可将xml转换成map
}



6.实例3:将对象转换成Json
/**
* 将对象转换成Json格式的字符串
* @param object 要转换成Json的对象
* @return String:Json格式的字符串
*/
public static String convertObject2Json(Object object) {
xStream = new XStream(newJsonHierarchicalStreamDriver() {
publicHierarchicalStreamWriter createWriter(Writer out) {
//删除根节点
return new JsonWriter(out, JsonWriter.DROP_ROOT_MODE);
}
});
return xStream.toXML(object);
}