浏览 6945 次
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-06
需求 项目功能:查询数据并生成XML文件然后上传至指定服务器 本模块功能:实现Java对象树输出到 XML文件。 要求 1. 支持对象及属性的扩展,而XML输出模块代码基本不变。 2. 考虑到内存压力,要求该模块实现以追加方式操作XML文件。 输入 Java对象树(提供一个类以方法,作为该对象的操作入口) 输出 XML文档 数值传输对象(DTO,Data Transfer Object),仅包含属性和setter/getter方法。如例1所示。属性的型别基本固定(例如String, int,boolean,List等),对于List的属性,可能包含另一个Java Object(如例3所示)。XML输出格式很简单,除去头部信息之外基本是attribute+value。例2是例1对象XML输出片段。 例1 java 代码
例2 xml 代码
例3 java 代码
分析 先介绍一下XML输出模块的旧版本。它直接处理判断对象的类型,并显示获取其getter方法,得到属性的值后操作XML文档(即dom4j的Document)。如下所示: java 代码
面向对象设计两个重要原则:单一职责原则(SRP)和开放-闭合原则(OCP)。SRP要求对每个类仅有一个引起它变化的原因。OCP要求对扩展开放,对修改封闭。<o:p></o:p> 上述代码很容易理解,但它充满臭味:不必要的重复和脆弱性(想象如何把例3展示的CarrierFlight输出到XML)。引起上述代码发生变化的原因很多:Java对象树中某个对象的属性或者XML输出格式改变。同时,缺乏抽象导致该类很难扩展(例如增加对新类型的Object的支持而代码不改变),每次修改都必须改动同一个类。<o:p></o:p> <o:p>遵循SRP和OCP,需要:</o:p> <o:p>1.把XML输出和对象解析过程分离</o:p> <o:p>2.把频繁变化的部分抽象 设计 对象解析 如说封装对象及属性的变化。数值对象有属性组成(以及setter/getter方法,此处忽略);Property(及属性)由类型(已封装成Type类,它将常用的类型定义成类并将静态实例暴露给外界),名称和Alias组成。对象树实际上是数据结构中的树。属性就是叶子。List型属性是可解析的,因此有字节点;非List型属性是末级节点。是否可解析可通过调用listable方法判断。 Property类实现了属性初始化(加载所有属性并生成相应对象供解析时使用)。利用反射机制可获得每个属性的的getter方法并在对象上调用该方法以取得其值。遍历所有节点可构造成一棵Element(稍后还会讲到该接口)树。 XML输出 dom4j是一个开源的XML工具,它支持XML解析和输出。但输出XML的过程采用内存构造Document方式。输出时调用Document.write方法写文件。前面已经提到,由于对象树非常庞大,一次构造完整的Document对象将导致OutOfMemoryError错误。如果能够实现以Append操作XML文件方式替换前面提到的方式,将会避免该问题出现。 Element接口定义了XML元素这个概念。它支持设置元素名称,文本和IO输出操作。XMLStream实现了Element接口,可以表示一个XMl元素并能输出到指定设备。XMLWriter实现了对Element输出到XML的过程。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-05-18
你这个,不能实现,在对像中,还有别的对像的情况吧,你只实现了最基础的一层式xml。
还不如用这个包 com.thoughtworks.xstream.XStream. 可以将对像直接xstream.toXML(obj),也可以将xml 还原成对像 xstream.fromXML(xml); 所有操作,一句话搞定 |
|
返回顶楼 | |
发表时间:2007-05-18
zhangbo297600 写道 你这个,不能实现,在对像中,还有别的对像的情况吧,你只实现了最基础的一层式xml。
还不如用这个包 com.thoughtworks.xstream.XStream. 可以将对像直接xstream.toXML(obj),也可以将xml 还原成对像 xstream.fromXML(xml); 所有操作,一句话搞定 说的没错。一句话可以搞定。 但你没理解我的应用上下文,我提到要输出对象可能非常非常大,一次输出到XML可能会报OutOfMemoryError。 所以才有我的解决方案:就是降低操作的对象级别,多次写文件。以缓解可能的内存压力。项目从一开始就确定要避免一次性输出文件。 至于对象中的各种情况,代码没有考虑太多,但支持扩展能力。 com.thoughtworks.xstream.XStream的方法toXML(obj),能否支持超大对象的输出? |
|
返回顶楼 | |
发表时间:2007-05-18
如果不考虑对象很大,java.beans.XMLEncoder,java.beans.XMLDecoder直接就可以做
|
|
返回顶楼 | |
发表时间:2007-05-19
引用 我提到要输出对象可能非常非常大,一次输出到XML可能会报OutOfMemoryError。 能有多大的对象?xstream应该支持大对象。不过xstream也有其局限的地方。 |
|
返回顶楼 | |
发表时间:2007-05-28
有没有试试axiom,听起来不错哦!
|
|
返回顶楼 | |