网上O/X Mapping的资料大多非常分散,不方便对比分析,本文汇集了一段时间这方面的学习成果。
(一)基本概念
★O/X Mapping(OBJECT/XML 映射):即是在JAVA对象和XML 之间的映射,互相转换。(与ORM类似)
主要有以下两种:
*数据绑定:是指取出一些数据(比如从 XML 文档、文本文件或者数据库中)并通过程序表示这些数据的过程--把数据 绑定到虚拟机(VM)能够理解并且可以操作的某种内存中结构。(如JAXB,Castor等)
*序列化/反序列化: 从JAVA到xml 为序列化,反之,从xml到JAVA为 反序列化,这里主要指不通过DTD,或SCHEMA等直接做转换的方法(如Xstream等)。
相比数据绑定,序列化/反序列化的要求比较低(无需提供XML Schema),更加“小快灵”,当然功能也不如数据绑定强大。
(二)文档模型与数据绑定
以Dom4j为首的文档模型工具,对于简单的数据结构的XML的解析应该是适用的。但是当XML结构变得更大更复杂很大,或是格式经常变更的场合,开发及维护起来就会越来越困难了。
为解决这个问题数据绑定(如:JAXB,Castor等)出现了。
文档模型和数据绑定(如:JAXB,Castor等)都在内存中建立文档的表示,都需要在内部表示和标准文本 XML 之间双向转换。 两者的区别在于文档模型尽可能保持 XML 结构,而数据绑定只关心应用程序所使用的文档数据。
文档模型和数据绑定 之于 数据世界中JDBC和ORM之间的关系非常相似(ORM本身就是针对数据库的轻量级数据绑定框架)。O/X Mapping 是JAVA处理XML的比较高一级的抽象,它自然的让开发人员与底层技术隔离,有效地减低了开发难度。
对于这类需求无论减轻开发难度还是解耦的观点来看,数据绑定应该都是更佳的选择。
(三)选择之前的关注点
★以谁(JAVA类 或 XML)为中心
归纳起来有以下情况:
*以JAVA类为中心 :既存Java 类,需要映射到XML。
*以Xml为中心:既存XML需要映射到Java 类。
*JAVA类与XML兼顾:Java 类 和 XML都已存在(或都不存在),需要做映射。
应用场景会直接影响映射方式的选择。
★映射的方式
*代码生成:数据绑定工具的利器,这类代码往往都带有注解。当然熟悉规则后也可以手工开发,但是难度较大。
应用场景:只是应用“在以Xml为中心”的场合
优点:无编码,减轻工作量
缺点:转换前提的XML需要有对应的 XML Schema(*.XSD) 文件,XML变更要重做生成
*映射绑定:比代码生成具有更大的灵活性。使用真正的对象类将数据和行为组合在一起。也可以在一定程度上解除对象类与实际 XML 之间的耦合。修改映射定义(而不需要改变应用程序代码)通常处理 XML 文档结构中微小的变化。甚至可以用一种格式定义单独的输入和输出映射来对文档进行数据分解,并用另一种格式编组它们。
应用场景:一般应用在 "JAVA与XML兼顾"的场合
优点:当然是类与实际 XML 之间的耦合性降低,JAVA类或 XML变更的场合,只改映射文件就行了。
缺点:在设置方面,它确实比生成代码方法需要花费更多精力。
*编码方式:映射绑定的程序实现版本(Xstream独有?)
应用场景:一般应用在 "JAVA与XML兼顾"的场合
优点:相对简单,JAVA类与XML大部分一致时比较方便
缺点:耦合性强,Java类 或XML的变动都可能影响代码
*默认方式:按照框架默认的方式,直接进行匹配的方式。(Xstream,Castor)
应用场景:只是应用“在以JAVA类为中心”的场合
优点:无配置,简单
缺点:完全依赖工具(需要清楚工具的各种限制)
★数据类型支持问题
不同的工具对数据类型的支持程度会有差别。(如:MAP型数据,日期格式转换,中文编码等)
★性能问题
对于大数据量的需求来说这也是必须要考虑的。
(四)研修对象
挑选了一些我认为比较“主流”的工具。
序列化工具:
Xstream (一个使用简单的序列化工具,颇具人气)
Betwixt (Apache Commons下的一个组件)
数据绑定工具:
JAXB (SUN推出的业界标准,当然必修)
Castor (自从被Spring3.0 包装进去,地位提高了许多)
JiBX (以效率高而闻名的映射工具,还有插件支持)
XMLbeans (又一个Apache旗下组件,支持“游标”概念)
Smooks (一款适用很多数据类型的数据转换平台)