分类: Java
2012-02-09 15:12:01
castor框架采取数据绑定模型进行数据处理。接口简单。相对于文档模型,数据绑定模型并不记录文档树结构,所占用的内存更少。
castor框架使用数据绑定配置来指定生成的XML格式。灵活性强。可不需要文档格式验证。
更多细节:http://www.ibm.com/developerworks/cn/xml/x-bindcastor/
接口简单,上层包装完善。无需映射直接序列化/反序列化Java对象来完成于xml文本的转换,速率快,生成文档简介。但文档灵活性较弱。
更多细节:
castor框架所需要的依赖包包括jta,servlet-api,avalon-framework,cglib,commons-logging,log4j,logkit,xerces,再加上自身jar包,框架复杂程度可见一斑。
xstream所依赖的包仅为xpp3与xstream本身(其实如果不使用xpp3的解析器,而直接使用dom解析器,xstream仅需其本身一个jar包即可。是一个非常轻量级的XML解析技术。
经过比较,可以发现xstream相对于castor框架来说是一个非常轻量级的工具。
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名称。在这一方面,两种技术旗鼓相当。
本文作者为了验证两种技术的XML处理速度,专门写了程序进行测试。程序分别对两种技术的读/写进行了测试。其中,需要转换的对象和文本数据如下:
测试环境:
XML:
浙江省^^^杭州市^^^西湖区^^^创业大厦6层
|
Order.java
public class Order { private String orderCode; private String wareHouseCode; private Integer customerId; private Long tradeId; private String orderType; private String shipping; private Double itemsValue; private Contact contact; private
List private String companyCode; private Double codItemValue; private String preSell; private String sendStartTime; private String sendEndTime; private String remark; //get & set methods } |
Item.java
public class Item { private String spuCode; private String itemName; private String itemCount; private Double itemValue; private String spuName; //get & set methods } |
Contact.java
public class Contact { private String contactName; private String zipCode; private String telephone; private String mobilePhone; private String address; private String province; private String city; private String country; private String adr; //get & set methods } |
测试结果:
|
castor read(ms) |
xstream read(ms) |
castor write(ms) |
xstream write(ms) |
10 |
63 |
31 |
31 |
31 |
100 |
297 |
48 |
156 |
47 |
1000 |
2328 |
327 |
1360 |
203 |
10000 |
22687 |
3423 |
14124 |
1906 |
100000 |
224541 |
32686 |
136464 |
19093 |
1000000 |
2210592 |
319271 |
1435958 |
196888 |
速率差异原因:首先,castor产生的class更大,在类加载过程中消耗的时间将比xstream多得多。其次,castor对于XSD的验证是相当严格的,而xstream则几乎直接忽略任何验证。这些都导致了xstream在效率上大大高于castor。
同时,本文作者还针对多线程情境下的两者的性能进行了比较。比较结果为:
castor read |
xstream read |
castor write |
xstream write |
|
10 |
78 |
31 |
47 |
31 |
100 |
485 |
110 |
203 |
140 |
1000 |
3610 |
1063 |
1828 |
1640 |
通过锁和唤醒机制保证所有线程同时启动,并作用于两种解析器上,所获得的结果是,读的方面xstream的效率约是castor的3.5倍,写的方面两者相差不多,约是castor的1.3倍。由于线程数限制,不能进行更大规模的压力测试。
由此可见,在处理大量数据的时候,xstream读/写的效率比castor快了将近7倍。在处理效率方面,xstream技术较castor框架技术优越很多。
通过对xstream应用的研究,本文作者还发现对xstream技术进一步优化的方案。
首先,xstream支持使用多种XML解析器进行XML解析。通过比较,发现xstream使用的默认XPP3解析器的性能最优。XPP3运用的是拉式的解析,相较于dom解析器的效率优势,可以从如下表格中获得:
|
xpp3 read |
dom read |
xpp3 write |
dom write |
10 |
16 |
110 |
15 |
15 |
100 |
46 |
94 |
31 |
31 |
1000 |
329 |
843 |
203 |
219 |
10000 |
3511 |
9200 |
1984 |
2015 |
100000 |
32246 |
78642 |
19306 |
20727 |
1000000 |
334222 |
806337 |
201244 |
196269 |
在写操作的时候,两者的效率类似,但在读操作的时候,XPP3解析器的效率是dom解析效率的2倍多。
另一方面,xstream还提供了一个setMode()方法。该方法可以指定xstream在生成对象图的时候是否查找对象引用。在我们的应用中,可以推荐使用setMode(XStream.NO_REFERENCES)。调用该方法之后的性能提升如下表:
|
xpp3 read |
xpp3 nr read |
xpp3 write |
xpp3 nr write |
10 |
16 |
0 |
15 |
16 |
100 |
46 |
16 |
31 |
16 |
1000 |
329 |
297 |
203 |
250 |
10000 |
3511 |
2855 |
1984 |
2077 |
100000 |
32246 |
27210 |
19306 |
20539 |
1000000 |
334222 |
276958 |
201244 |
197629 |
不难看出,该方法在读的时候可以将xstream的效率再提高1.2倍。值得注意的是,当xml中存在重复引用或环时不可用。
其他使用xstream的注意点:
线程安全方面,根据xstream官方文档显示,xstream技术是线程安全的。但在超高并发应用情境下的线程安全性还需要进行压力测试。
xstream在文本解析中的缺陷,比如不支持在xml中添加“_”符号,不支持注释。但是这些都可以在程序中避免。
xstream没有对xml的字符集进行验证,所以对数据的传入和传出进行字符集设置,并反复测试验证是否会出现中文乱码。这一点非常重要。
测试方面包括正确性测试和压力测试。可以自己编写一个客户端程序,然后通过各种场景数据加护验证正确性。在正确性得到验证的前提下,到专门的环境下进行同淘宝数据级别相仿的压力测试,并提取性能数据。