xstream使用 对象使用消耗内存吗

IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
XML 序列化用处很多,包括对象持久化和数据传输。但是一些 XML 序列化技术实现起来可能很复杂。XStream 是一个轻量级的、简单易用的开放源代码 Java™ 库,用于将 Java 对象序列化为 XML 或者再转换回来。了解如何设置 XStream,如何使用它序列化和逆序列化对象以及从 XML 配置文件读取配置属性。
(), 资深软件工程师, IBM India Private Ltd.
Rajiv Bangalore 是 IBM India 的一位资深软件工程师。在七年的职业生涯中参与过多个 Java Platform, Enterprise Edition (Java EE) 开发项目。可以通过
和他联系。
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列化工具而不是数据绑定工具,就是说不能从 XML 或者 XML Schema Definition (XSD) 文件生成类。
和其他序列化工具相比,XStream 有三个突出的特点:
XStream 不关心序列化/逆序列化的类的字段的可见性。序列化/逆序列化类的字段不需要 getter 和 setter 方法。序列化/逆序列化的类不需要有默认构造函数。
不需要修改类,使用 XStream 就能直接序列化/逆序列化任何第三方类。
设置开发环境按照下列步骤下载和安装 XStream(下载链接参见 ):从 Eclipse 网站下载 Eclipse。安装的时候将其解压到选定的文件夹,本文中用 eclipse_home 表示。本文假定使用 Eclipse 3.3。从 XStream 网站下载最新的 XStream 稳定版本。安装的时候解压到选定的文件夹,本文用 xstream_home 表示。假定使用的 XStream 版本是 1.2.2。从 Sun 网站下载 Java Platform, Standard Edition (J2SE) 软件开发工具箱(SDK)。安装到选定的文件夹,本文用 java_home 表示。假定版本为 1.5.0_05。创建一个 Java 项目要创建一个 Java 项目,需要选择 File & New & Project,然后按下列步骤操作:选择 Java & Java Project & Next(如
图 1. 新建 Java 项目填写项目名称并单击 Next(如
图 2. 填写项目名称单击 Finish 完成该任务(如
图 3. 完成设置 显示了新建的 Java 项目。图 4. 新建的 Java 项目添加 XStream 支持按照下列步骤向新建的项目添加 XStream 库:在 Eclipse 的 Project Explorer 中选择新建的项目,从 Project 菜单中选择 Properties(如
图 5. 添加 XStream 库单击 Add External JARs,从 xstream_home/lib 文件夹中选择 xstream-1.2.2.jar。单击 OK 结束(如
图 6. 完成 XStream 支持的添加 显示了添加 XStream 支持后的项目。图 7. 添加的库序列化对象这个简单的例子示范了如何使用 XStream 序列化/逆序列化对象,包括两个类:Writer 和 Reader。Writer 类使用 XStream API 把 Employee 类型的对象序列化为 XML 并存储到文件中(如
所示)。清单 1. Writer.javapackage com.
import java.io.FileNotFoundE
import java.io.FileOutputS
import com.thoughtworks.xstream.*;
public class Writer {
public static void main(String[] args) {
Employee e = new Employee();
//Set the properties using the setter methods
//Note: This can also be done with a constructor.
//Since we want to show that XStream can serialize
//even without a constructor, this approach is used.
e.setName("Jack");
e.setDesignation("Manager");
e.setDepartment("Finance");
//Serialize the object
XStream xs = new XStream();
//Write to a file in the file system
FileOutputStream fs = new FileOutputStream("c:/temp/employeedata.txt");
xs.toXML(e, fs);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}Reader 类读取该文件,逆序列化 XML 并把数据装入 Java 对象(如
所示)。清单 2. Reader.javapackage com.
import java.io.FileInputS
import java.io.FileNotFoundE
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomD
public class Reader {
public static void main(String[] args) {
XStream xs = new XStream(new DomDriver());
Employee e = new Employee();
FileInputStream fis = new FileInputStream("c:/temp/employeedata.txt");
xs.fromXML(fis, e);
//print the data from the object that has been read
System.out.println(e.toString());
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} 显示了 Employee 对象的结构。清单 3. Employee.javapackage com.
public class Employee {
public String getName() {
public void setName(String name) {
this.name =
public String getDesignation() {
public void setDesignation(String designation) {
this.designation =
public String getDepartment() {
public void setDepartment(String department) {
this.department =
public String toString() {
return "Name : "+this.name+
"\nDesignation : "+this.designation+
"\nDepartment : "+this.
}读取配置文件多数应用程序都要用到一些属性。这些属性可能是要连接的数据源的名称或者日志文件的位置。配置文件最适合存储这类数据,从而在修改这些属性的时候不需要重新编译应用程序,应用程序维护起来也更容易。下面的例子说明如何在应用程序中使用 XStream 从 XML 配置文件中读取配置属性。
XML 数据绑定通常需要从 XML 文件生成 Java 对象。使用 XStream 省略了生成对象这个步骤。只需要编写一个 Java 类将类的字段映射到希望读取的 XML 的元素。这个例子使用的配置文件如
所示。清单 4. Config.xml&?xml version="1.0" encoding="UTF-8"?&
&datasource-name&IRIS&/datasource-name&
&ipaddress&9.124.74.85&/ipaddress&
&logfilename&DailyLogApplication.log&/logfilename&
&appender&console&/appender&
&/config& 显示的 ConfigReader 类读取该配置文件并将属性加载到 Java 对象中。清单 5. ConfigReader.javapackage com.
import java.io.FileInputS
import java.io.FileNotFoundE
import com.thoughtworks.xstream.*;
import com.thoughtworks.xstream.io.xml.DomD
public class ConfigReader {
String datasourcename =
String ipaddress =
String logfilename =
String appender =
public String toString() {
// This method prints out the values stored in the member variables
return "Datasource Name : "+datasourcename+
" \nIP Address : "+ipaddress+
" \nLogfilename : "+logfilename+
" \nAppender : "+
* @param args
* @throws FileNotFoundException
public static void main(String[] args) throws FileNotFoundException {
XStream xs = new XStream(new DomDriver());
FileInputStream fis = new FileInputStream("c:/temp/Config.xml");
xs.aliasField("datasource-name", ConfigReader.class, "datasourcename");
xs.alias("config", ConfigReader.class);
ConfigReader r = (ConfigReader)xs.fromXML(fis);
System.out.println(r.toString());
}结束语创建和开发使用 XStream 的应用程序只需要简单的几个步骤。本文介绍如何使用 XStream 序列化/逆序列化 Java 对象和读取配置文件,通过 XStream 网站(教程链接参见 )可以进一步了解别名、注解和转换程序。别名和转换程序可以让您完全控制生成的 XML。
下载描述名字大小本文的 Java 源代码3KB
参考资料 您可以参考本文在 developerWorks 全球站点上的 。:轻松掌握 XStream 的快速入门文章。读一读就会知道使用它实现对象和 XML 之间的转换是多么简单。XStream
页面:关于调整 XStream 输出的详细介绍。:帮助高级用户完全控制生成/读取的 XML。(Brett McLaughlin,developerWorks,2004 年 5 月):进一步了解数据绑定。
(Dennis Sosnoski,developerWorks,2003 年 6 月):XML 数据绑定的其他方法。 页面:看看 XML 专区更新的资源中心。:了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。:developerWorks XML 专区提供了大量技术文章和技巧、教程、标准以及 IBM 红皮书。 :随时关注技术的最新进展。:浏览关于本文主题和其他技术主题的书籍。:倾听 IBM 技术专家的讲座。 :从 Eclipse 网站下载并安装 Eclipse。 下载 :从 XStream
网站下载这个将对象序列化为 XML 或者从 XML 生成对象的简单的库。:用这些试用软件构建您的下一个开发项目,可直接从 developerWorks 下载。:参与和 XML 有关的讨论。阅读本文后在这个论坛上提交您的见解和建议。XML 专区编辑负责该论坛,欢迎您的参加。:访问这些 blog,加入 。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=XML, Java technology, Open sourceArticleID=306793ArticleTitle=使用 XStream 把 Java 对象序列化为 XMLpublish-date=官网:http://xstream.codehaus.org/
官网上有很详细且简单易学的教程和实例。
作者:Headsen
简单高效的和JavaBean转换工具。最核心的两个方法。
XStream xStream = new XStream();
String xmlStr = xStream.toXml(obj);
Object obj = xStream.fromXml(obj);
1、对于一个类的空对象(所有属性不赋值),返回一个根节点的报文。属性为Null的属性不会生成节点。属性非null的空值(如空字符串、空数组)会生成空白节点。
2、如果不设置类的别名,报文的根节点为【包名+类名】,显的臃肿,如:“xxx.package.ClassName”。
3、所有的,都有对应的java方法。注解的好处就是简单,但是耦合。两种方式各有各的好处。使用注解时,要调用下面方法激活。
xStream.processs(Person.class);
4、如果要处理的对象,多个属性引用统一对象,那么生成的XML很多节点数据会相同。XStream默认使用reference来精简XML的大小。如:
List order = new ArrayList();
order.add(bj);
order.add(bj);
order.add(order);
&id&Next Road Cross&/id&
&CD reference="../CD"/&
&list reference=".."/&
? ? ? ?可以通过setModel设置引用模式。但是,在上述中,由于Order引用自己,不过不设置引用,则会抛出依赖。
5、对于没有父(根)节点的XML报文,可以使用隐式集合。如:
xStream.addImplicitCollection(Person.class, "friends");
6、默认情况下,XStream会生成干净的XML。有时候为了生成配置文件,或可读性更好的XML,需要使用节点属性。
xStream.useAttributeFor(Person.class, "firstname");
&person firstname="Headsen"&&/person&
7、一些结构对象,想作为节点转换时,需要实现对应的Convertor。如:
* 联系方式类的转换器
public class PhoneNumberConvertor implements SingleValueConverter {
public boolean Convert(Class type) {
return type.equals(PhoneNumber.class);
public Object fromString(String number) {
return new PhoneNumber(0, number);
public String toString(Object phone) {
return ((PhoneNumber) phone).getCode() + "-" + ((PhoneNumber) phone).getNumber();
xstream.registerConverter(new PhoneNumberConvertor());
&person lastname="Zhang" fax="111-412-4444"&
8、有时候,不想某些属性生成在XML中,可使用以下方法:
xStream.omitField(Person.class, "firstname");
9、XStream还支持转换为ON格式,只需注入合适的解析驱动即可。但是XStream并不建议这样做。格式有很大的局限性,特别是表示一些稍微复杂的数据类型。
XStream xstream = new XStream(new JettisonMappedXmlDriver());
XStream很简单,简单的记一下。代码都没贴上来。这里有个不错的。
b.com/hoojo/archive//2025197.html1073人阅读
Java(19)
我们经常会有需求,比如调用别人的接口,别人会返回给你json或者xml格式的数据,然后我们要转换为相应的对象供我们自己使用;
也有的时候是别人的调我们的接口,让我们提供xml格式的数据或者json格式的数据,json的话这里都不说了,很好处理,甚至springMvc本身就很容易支持。
下面只介绍xml和对象彼此转换
首先我们需要引入的jar包:xstream-1.4.8.jar
下面直接贴代码,代码是在springMvc环境下写的
@Controller
public class NavigationAppDataController extends BaseController{
@SuppressWarnings("unused")
private static final Logger
log = LoggerFactory.getLogger(NavigationAppDataController.class);
@Autowired
private StoNavigationAppManager stoNavigationAppM
@RequestMapping(value = "/appsite/getNavigationXmlData.htm")
public void getNavigationXmlData(HttpServletRequest request,HttpServletResponse response){
List&NavigationAppCommand& findStoreNavigationAppToXml = stoNavigationAppManager.findStoreNavigationAppData();
XStreamConfig xStreamConfig = new XStreamConfig();
xStreamConfig.getAliasMap().put("topcategories", List.class);
xStreamConfig.getAliasMap().put("category", NavigationAppCommand.class);
String xml = toXML(findStoreNavigationAppToXml, xStreamConfig);
response.setCharacterEncoding(CharsetType.UTF8);
response.setContentType("application/xml");
response.getWriter().write(xml);
* 将bean对象根据xStreamConfig格式转成xml格式的字符串返回
* xStreamConfig
public static String toXML(Object bean,XStreamConfig xStreamConfig){
XStream xstream = constructXStream(xStreamConfig);
return xstream.toXML(bean);
* 将xml字符串转为相对应的对象
public static &T& T fromXML(String xml){
return fromXML(xml, null);
public static &T& T fromXML(String xml,XStreamConfig xStreamConfig){
XStream xstream = constructXStream(xStreamConfig);
return (T) xstream.fromXML(xml);
public static XStream constructXStream(XStreamConfig xStreamConfig){
XStream xstream = new XStream();
if (Validator.isNotNullOrEmpty(xStreamConfig)){
Map&String, Class&?&& aliasMap = xStreamConfig.getAliasMap();
if (Validator.isNotNullOrEmpty(aliasMap)){
for (Map.Entry&String, Class&?&& entry : aliasMap.entrySet()){
String key = entry.getKey();
Class&?& value = entry.getValue();
xstream.alias(key, value);
Map&String, Class&?&& implicitCollectionMap = xStreamConfig.getImplicitCollectionMap();
if (Validator.isNotNullOrEmpty(implicitCollectionMap)){
for (Map.Entry&String, Class&?&& entry : implicitCollectionMap.entrySet()){
String key = entry.getKey();
Class&?& value = entry.getValue();
xstream.addImplicitCollection(value, key);
* XStream相关配置.
public final class XStreamConfig{
/** 别名. */
private Map&String, Class&?&& aliasMap
= new HashMap&String, Class&?&&();
/** 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType. */
private Map&String, Class&?&& implicitCollectionMap = new HashMap&String, Class&?&&();
* 获得 别名.
* the aliasMap
public Map&String, Class&?&& getAliasMap(){
return aliasM
* 设置 别名.
* aliasMap
the aliasMap to set
public void setAliasMap(Map&String, Class&?&& aliasMap){
this.aliasMap = aliasM
* 获得 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType.
* the implicitCollectionMap
public Map&String, Class&?&& getImplicitCollectionMap(){
return implicitCollectionM
* 设置 隐式集合 隐藏,隐藏,比如下面有list,泛型中的第二个参数 Class 是 ownerType.
* implicitCollectionMap
the implicitCollectionMap to set
public void setImplicitCollectionMap(Map&String, Class&?&& implicitCollectionMap){
this.implicitCollectionMap = implicitCollectionM
实现方法很简单另外这里说一下response的几个参数设置的意思。
response.setCharacterEncoding(CharsetType.UTF8);
设置返回数据的编码格式如果不设置这个,返回到客户请求端的数据可能会乱码,这个编码格式一定要统一掉
response.setContentType(“application/xml”);
设置内容类型,决定浏览器将以什么类型读我们返回的数据进行展示,如果不设置,那么浏览器显示的就是一大坨xml格式的字符串,没有任何效果,而设置之后就可以像我上面截图的那样,节点可以点击展开和关闭,并且数据和节点颜色对比明显,便于观看。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:101037次
积分:1882
积分:1882
排名:第14560名
原创:69篇
转载:35篇
评论:66条
文章:50篇
阅读:81476
JAVA技术交流群:
(5)(5)(2)(4)(6)(12)(14)(4)(2)(1)(1)(10)(2)(3)(2)(1)(1)(4)(3)(2)(3)(4)(4)(4)(2)(3)(2)一般场景下xstream与castor的比较-java-电脑编程网一般场景下xstream与castor的比较作者:佚名 和相关&&技术介绍
1.1.
castor技术简介
&&&&&&&& castor框架采取数据绑定模型进行数据处理。接口简单。相对于文档模型,数据绑定模型并不记录文档树结构,所占用的内存更少。
&&&&&&&& castor框架使用数据绑定配置来指定生成的XML格式。灵活性强。可不需要文档格式验证。
&&&&&&&& 更多细节:/developerworks/cn/xml/x-bindcastor/
1.2.
xstream技术简介
&&&&&&&& 接口简单,上层包装完善。无需映射直接序列化/反序列化Java对象来完成于xml文本的转换,速率快,生成文档简介。但文档灵活性较弱。
&&&&&&&& 更多细节:http://xstream.codehaus.org/
技术对比
2.1.
框架量级比较
&&&&&&&& castor框架所需要的依赖包包括jta,servlet-api,avalon-framework,cglib,commons-logging,log4j,logkit,xerces,再加上自身jar包,框架复杂程度可见一斑。
&&&&&&&& xstream所依赖的包仅为xpp3与xstream本身(其实如果不使用xpp3的解析器,而直接使用dom解析器,xstream仅需其本身一个jar包即可。是一个非常轻量级的XML解析技术。
&&&&&&&& 经过比较,可以发现xstream相对于castor框架来说是一个非常轻量级的工具。
2.2.
编程难易度比较
&&&&&&&& castor的编程需要针对变量――XML标签进行映射指定(mapping),这使得映射规则变换较为自由。对于castor框架来说,完成读/写所需要的步骤如下:
// write it out as XML (if not already present)
Mapping map = new Mapping();
map.loadMapping("mapping.xml");
File file = new File("test.xml");
Writer writer = new FileWriter(file);
Marshaller marshaller = new Marshaller(writer);
marshaller.setMapping(map);
marshaller.marshal(bean);
// now restore the value and list what we get
Reader reader = new FileReader(file);
Unmarshaller unmarshaller = new Unmarshaller(map);
FlightBean read =
(FlightBean)unmarshaller.unmarshal(reader);
} catch (MappingException ex) {
ex.printStackTrace(System.err);
&&&&&&&& xstream框架在映射中仅需指定特定类与其对应标签的名字即可,其余映射自动完成。对于xstream来说,完成读/写所需要的步骤如下:
XStream xstream = new XStream();
xstream.alias("person", Person.class); //bind
class and xml tag
xstream.alias("phonenumber",
PhoneNumber.class);
String xml = xstream.toXML(joe); //write
Person joe2 =& (Person)xstream.fromXML(xml); //read
&&&&&&&& 两种技术的编码都很容易实现。castor利用了mapping文件,在映射取名中更为灵活。但是在物流系统当前的需求中,并不需要特别指定的tag名称。在这一方面,两种技术旗鼓相当。
3.3. xml处理速度对比
&&&&&&&& 本文作者为了验证两种技术的XML处理速度,专门写了程序进行测试。程序分别对两种技术的读/写进行了测试。其中,需要转换的对象和文本数据如下:
&&&&&&&& 测试环境:
&&&&&&&& XML:
&&&&&&&& &orderCode&LP445&/orderCode&
&&&&&&&& &wareHouseCode&SHCC&/wareHouseCode&
&&&&&&&& &customerId&&/customerId&
&&&&&&&& &tradeId&&/tradeId&
&&&&&&&& &orderType&NORMAL&/orderType&
&&&&&&&& &shipping&EXPRESS1&/shipping&
&&&&&&&& &itemsValue&5500.0&/itemsValue&
&&&&&&&& &contact&
&&&&&&&&&&&&&&&&&& &contactName&张三&/contactName&
&&&&&&&&&&&&&&&&&& &zipCode&310013&/zipCode&
&&&&&&&&&&&&&&&&&& &telephone&8&/telephone&
&&&&&&&&&&&&&&&&&& &mobilePhone&&/mobilePhone&
&&&&&&&&&&&&&&&&&& &address&浙江省^^^杭州市^^^西湖区^^^创业大厦6层&/address&
&&&&&&&&&&&&&&&&&& &province&浙江省&/province&
&&&&&&&&&&&&&&&&&& &city&杭州市&/city&
&&&&&&&&&&&&&&&&&& &country&西湖区&/country&
&&&&&&&&&&&&&&&&&& &adr&创业大厦6层&/adr&
&&&&&&&& &/contact&
&&&&&&&& &productList&
&&&&&&&&&&&&&&&&&& &item&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &spuCode&TEST&/spuCode&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemName&Nokia
N73&/itemName&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemCount&2&/itemCount&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemValue&2000.0&/itemValue&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &spuName&颜色:红色;尺寸:L&/spuName&
&&&&&&&&&&&&&&&&&& &/item&
&&&&&&&&&&&&&&&&&& &item&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &spuCode&&/spuCode&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemName&Nokia
N72&/itemName&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemCount&1&/itemCount&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &itemValue&1500.0&/itemValue&
&&&&&&&&&&&&&&&&&&&&&&&&&&& &spuName&套餐A&/spuName&
&&&&&&&&&&&&&&&&&& &/item&
&&&&&&&& &/productList&
&&&&&&&& &companyCode&STO&/companyCode&
&&&&&&&& &codItemValue&456.0&/codItemValue&
&&&&&&&& &preSell&true&/preSell&
&&&&&&&& &sendStartTime&
17:23:47.569 CST&/sendStartTime&
&&&&&&&& &sendEndTime&
17:23:47.569 CST&/sendEndTime&
&&&&&&&& &remark&11&/remark&
&&&&&&&& Order.
public class Order {
&&&&&&&& private
String orderC
&&&&&&&& private
String wareHouseC
&&&&&&&& private
Integer customerId;
&&&&&&&& private
Long tradeId;
&&&&&&&& private
String orderT
&&&&&&&& private
&&&&&&&& private
Double itemsV
&&&&&&&& private
&&&&&&&& private
List&Item& productL
&&&&&&&& private
String companyC
&&&&&&&& private
Double codItemV
&&&&&&&& private
String preS
&&&&&&&& private
String sendStartT
&&&&&&&& private
String sendEndT
&&&&&&&& private
& set methods
&&&&&&&& Item.
public class Item {
&&&&&&&& private
String spuC
&&&&&&&& private
String itemN
&&&&&&&& private
String itemC
&&&&&&&& private
Double itemV
&&&&&&&& private
String spuN
& set methods
&&&&&&&& Contact.java
public class Contact {
&&&&&&&& private
String contactN
&&&&&&&& private
String zipC
&&&&&&&& private
&&&&&&&& private
String mobileP
&&&&&&&& private
&&&&&&&& private
&&&&&&&& private
&&&&&&&& private
&&&&&&&& private
& set methods
&&&&&&&& 测试结果:
castor read(ms)
xstream read(ms)
castor write(ms)
xstream write(ms)
&&&&&&&& 速率差异原因:首先,castor产生的class更大,在类加载过程中消耗的时间将比xstream多得多。其次,castor对于XSD的验证是相当严格的,而xstream则几乎直接忽略任何验证。这些都导致了xstream在效率上大大高于castor。
&&&&&&&& 同时,本文作者还针对多线程情境下的两者的性能进行了比较。比较结果为:
castor read
xstream read
castor write
xstream write
&&&&&&&& 通过锁和唤醒机制保证所有线程同时启动,并作用于两种解析器上,所获得的结果是,读的方面xstream的效率约是castor的3.5倍,写的方面两者相差不多,约是castor的1.3倍。由于线程数限制,不能进行更大规模的压力测试。
&&&&&&&& 由此可见,在处理大量数据的时候,xstream读/写的效率比castor快了将近7倍。在处理效率方面,xstream技术较castor框架技术优越很多。&&&&&&
XStream性能进一步优化方案
&&&&&&&& 通过对xstream应用的研究,本文作者还发现对xstream技术进一步优化的方案。
&&&&&&&& 首先,xstream支持使用多种XML解析器进行XML解析。通过比较,发现xstream使用的默认XPP3解析器的性能最优。XPP3运用的是拉式的解析,相较于dom解析器的效率优势,可以从如下表格中获得:
xpp3 write
&&&&&&&& 在写操作的时候,两者的效率类似,但在读操作的时候,XPP3解析器的效率是dom解析效率的2倍多。
&&&&&&&& 另一方面,xstream还提供了一个setMode()方法。该方法可以指定xstream在生成对象图的时候是否查找对象引用。在我们的应用中,可以推荐使用setMode(XStream.NO_REFERENCES)。调用该方法之后的性能提升如下表:
xpp3 nr read
xpp3 write
xpp3 nr write
&&&&&&&& 不难看出,该方法在读的时候可以将xstream的效率再提高1.2倍。值得注意的是,当xml中存在重复引用或环时不可用。 其他使用xstream的注意点:
&&&&&&&& 线程安全方面,根据xstream官方文档显示,xstream技术是线程安全的。但在超高并发应用情境下的线程安全性还需要进行压力测试。
&&&&&&&& xstream在文本解析中的缺陷,比如不支持在xml中添加“_”符号,不支持注释。但是这些都可以在程序中避免。
&&&&&&&& xstream没有对xml的字符集进行验证,所以对数据的传入和传出进行字符集设置,并反复测试验证是否会出现中文乱码。这一点非常重要。
&&&&&&&& 测试方面包括正确性测试和压力测试。可以自己编写一个客户端程序,然后通过各种场景数据加护验证正确性。在正确性得到验证的前提下,到专门的环境下进行同淘宝数据级别相仿的压力测试,并提取性能数据。相关资料:|||||||一般场景下xstream与castor的比较来源网络,如有侵权请告知,即处理!编程Tags:                &                    

我要回帖

更多关于 xstream 继承对象 的文章

 

随机推荐