Castor功能与应用参考(一)

索引
3.1.3 小结
3.2.1 类描述符
3.4 总结
1. 项目简介
Castor是一个开源的Java项目。其主要目标是在XML数据、Java对象和数据库关系数据之间提供一种直接的映射,使得这三种对象数据可以相互之间自由转换。Castor项目在2000年3月发布第一个0.8版本,项目几经重构设计目前最新版本为1.1.2.1。
Castor项目主要包括XML与Java对象的映射(Castor XML),Java对象与关系数据库表映射(Castor JDO)两个关键功能。在Castor中,我们通过定义数据映射(Mapping)文件,在XML文档元素(节点、属性、文本等),Java类(类、字段属性等)和数据库表(关联表、表、字段)之间建立一一映射。通过XML Schema定义可以自动生成实体Java类定义,通过实体Java类定义可以自动生成XML元素与Java类之间的映射文件。
目前,优秀的Java对象关系映射(O/R Mapping)框架已经很多,商业化的如Oracle的TopLink,开源的如Hibernate,iBatis,Cayenne等,这些O/R框架的实现各有特点。Sun针对对象关系映射提出了JDO规范,针对XML与Java对象之间的绑定提出了JAXB规范。Castor的优势在于其提供O/R映射功能的同时提供了XML与Java对象间数据映射功能,通过使用集成的映射定义文件, XML数据,Java对象和关系数据之间可以无缝的相互转换。
2. Castor功能特性
1. Castor XML在Java对象模型与XML InfoSet之间建立相互转换和数据绑定功能;
2. 提供从XML文档定义自动是生成Java类定义文件的功能(Code Generator);
3. 通过自省方式在XML文档与Java对象间建立映射(不需要提供XML Schema和XML Mapping文件);
4. 通过定义映射文件在XML文档实体与Java对象实体间建立映射;
5. Castor JDO 为Java对象与数据库关系数据之间提供一种序列化与反序列化的框架。Castor JDO不同于Sun公司提出的JDO概念,但两者具有相似的目标;
6. Castor JDO以映射文件的方式定义Java对象模型与关系数据库表模型之间的映射;
7. 基于XML映射文件的方式定义三种不同数据对象模型之间的映射;
8. 提供内存缓存和提交写入(write at commit)方式,减少数据库JDBC操作;
9. 支持两阶段事务,对象操作回滚和数据库锁定侦测;
10. 支持OQL与标准SQL之间的映射,Castor JDO对象查询采用OQL语言;
11. 提供基于Java实体对象类定义生成映射文件的功能;
12. 提供基于XML输入文档生成Schema定义文件的功能;
我们将在下述章节中详细介绍Castor的上述功能,并给出操作示例。
3. Castor XML
Castor XML作为一个数据绑定框架,可以实现任何类似Java Bean的对象和XML文档表示之间的相互转换。通常情况下,Castor使用一组类描述符(ClassDescriptor)和字段描述符(FieldDescriptor)集来定义一个Java对象如何编组(Marshall)成XML数据或者从XML数据解编(Unmarshall)为Java对象。
3.1XML编组(Marshalling)框架
XML编组框架实现Java对象与XML文档间的相互转换。在下文中,除非显式提及,否则编组框架指编组和解编两种功能。Castor XML编组框架包含在两个主要的类org.exolab.castor.xml.Marshaller和org.exolab.castor.xml.Unmarshaller中。Castor XML编组解编功能示意如下图所示:
Castor XML Databinding
3.1.1 自省方式(introspection)的编组与解编
下面我们通过一个简单的示例展示XML编组框架以自省的方式在Java对象与XML文档之间转换的功能。首先,定义一个简单的Person类,该类包含两个字段:name和 birthday,分别指定义某个人的名字和出生日期。Person类定义如下:

import java.util.Date;
/** An simple person class */
public class Person implements java.io.Serializable {
/** The name of the person */
private String name = null ;
/** The Date of birth */
private Date birthday = null ;
/** Creates a Person with no name */
public Person() {
super ();
}
/** Creates a Person with the given name */
public Person(String name) {
this . name = name;
}
/**
* @return date of birth of the person
*/
public Date getDateOfBirth() {
return birthday ;
}
/**
* @return name of the person
*/
public String getName() {
return name ;
}
/**
* Sets the date of birth of the person
* @param name the name of the person
*/
public void setDateOfBirth(Date birthday ) {
this . birthday = birthday ;
}
/**
* Sets the name of the person
* @param name the name of the person
*/
public void setName(String name) {
this . name = name;
}
}
然后,我们定义一个Person类的实例并将其编组输出为XML,示例代码如下:

// 创建一个新的 Person 对象
Person person = new Person( "Ryan 'Mad Dog' Madden" );
Calendar birthday = new GregorianCalendar(1955, 8, 15);
person.setDateOfBirth(birthday.getTime());
// 构建编组后的 XML 文档输出
FileWriter writer = new FileWriter( "d://test.xml" );
// 编组 Person 实例为 XML 文档
Marshaller.marshal(person, writer);
上述代码输出结果为:

<?xml version="1.0" encoding="UTF-8"?>
< person >
< name > Ryan 'Mad Dog' Madden </ name >
< date-of-birth > 3855-09-15T00:00:00.000+08:00 </ date-of-birth >
</person>
下面的代码读取上述输出的XML文档并将解编为Java对象:

// 构建输入 XML 文档的 Reader
FileReader reader = new FileReader( "d://test.xml" );
// 解编 XML 文档为 Person 对象
person = (Person) Unmarshaller.unmarshal(Person. class , reader);
System.out.println("Name="+person.getName());
输出结果为:

Name=Ryan 'Mad Dog' Madden
3.1.2 使用映射文件方式的编组与解编
调用Marshaller和Unmarshaller的实例方法时,必须提供XML文档结构和Java类模型间的映射定义文件。关于Mapping映射文件的定义我们会在下述章节中给出详细介绍。下面是调用Marshaller和Unmarshaller的实例方法的代码示例:

// 加载映射文件
Mapping mapping = new Mapping();
mapping.loadMapping( "mapping.xml" );
// 为待解编的 XML 文档构建一个 Reader
reader = new FileReader( "test.xml" );
// 构建一个解编器 Unmarshaller
Unmarshaller unmarshaller = new Unmarshaller(Person. class );
unmarshaller.setMapping(mapping);
// 解编 XML 文档为 Person 对象
Person person = (Person) unmarshaller.unmarshal(reader);
3.1.3 小结
上述示例展示了使用Marshaller和Unmarshaller类的静态方法以自省的方式实现XML文档与Java对象之间的编组和解编,以及使用Mapping映射文件通过调用Marshaller和Unmarshaller的实例方法实现XML文档与Java对象之间的编组和解编两种方式。
前一种方式不需要构造Marshaller和Unmarshaller的实例;后一种方式需要构造Marshaller和Unmarshaller的实例,调用非静态方法完成上述功能。调用Marshaller和Unmarshaller的实例方法时,必须提供XML文档结构和Java类模型间的映射定义文件。
注意:当使用Marshaller Unmarshaller 的静态方法时,即使指定了映射定义文件,此映射定义也会被忽略。
3.2Castor XML的编组/解编机制
Castor通过类描述符和字段描述符几乎可以编组/解编所有的Java对象。当某个Java对象类描述符不存在时,编组框架通过使用反射(Reflection)方式获取对象的结构信息,并在内存中为此对象构造类描述符和字段描述符。当实体类的描述符存在时,Castor使用这些描述符提供的Java对象模型信息用来处理编组和解编。
编组与解编过程中,Castor要求实体类定义必须提供”public”类型的默认构造函数(不含参数)声明以及必要的”getter”和”setter”方法。
3.2.1 类描述符
类描述符( org.exolab.castor.xml.XMLClassDescriptor)使得编组框架具有足够的信息以正确的处理编组/解编过程。在Castor中,类描述符由XML编组框架和JDO框架(后文详细描述)共享。每个类描述符包含一组字段描述符( org.exolab.castor.xml.XMLFieldDescriptor)。
XML 类描述符具有两种构建方式:编译时构建和运行时构建。
l 编译时构建描述符
在编译时构建类描述符,一种方法是为每一个需要编组的实体类实现 org.exolab.castor.xml.XMLClassDescriptor接口;另一种方式是使用Castor提供的源代码生成器通过XML Schema定义文档在生成Java实体类定义的同时,为Java实体类生成相应的类描述符。
编译时构建类描述符的方式的主要优点是其执行速度快于运行时构建方式。
l 运行时构建描述符
使用运行时构建类描述符时,Castor可以直接通过反射自省方式Java实体类,也可以提供映射定义文件。这两种方式可以结合使用。对于默认的自省方式,实体类必须为必要的字段提供适当的setter/getter方法;如果没有给编组的字段数据指定setter/getter方法,Castor只能访问类型为”public”的字段。如果上述条件都不满足,Castor将不处理上述字段。
在Castor中,自省方式默认启动,不需要做任何设置。用户可以在castor.properties文件中设定必要的参数来控制自省方式的行为,如字段命名惯例,原始类型默认看作XML属性还是节点(Element)。用户可以查看castor.properties文件(在Castor发布Jar包中的”org/exolab/castor”路径下)获取详细信息。
使用映射文件描述实体类时,用户需要在编组/解编操作前加载映射定义。映射定义参考( org.exolab.castor.mapping.Mapping)。
3.3使用XMLContext获取编组器和解编器
Castor自 V1.1.2版本开始在XML编组框架中提供了XMLContext类,用于方便高效的获取Marshaller和Unmarshaller实例。上述3.1节中编组解编Person类实例的例子使用XMLContext实现的方式如下:

import org.exolab.castor.xml.XMLContext;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.xml.Unmarshaller;
// 构建 Mapping 实例
Mapping mapping = XMLContext.createMapping();
mapping.loadMapping( "mapping.xml" );
// 构建一个 XMLContext 实例并设定映射
XMLContext context = new XMLContext();
context.addMapping(mapping);
// 构建一个 Unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setClass(Person. class );
// 为待解编的 XML 文档构建一个 Reader
Reader reader = new FileReader( "test.xml" );
// XML 文档中解编 person 对象
Person person = (Person) unmarshaller.unmarshal(reader);
如上述代码所示,XMLContext提供了不同的工厂方法用于获取新的Marshaller,Unmarshaller和Mapping实例。当在一个应用中需要使用不止一个Unmarshaller实例时,可以根据需要调用XMLContext的createUnmarshaller实例方法。从同一个XMLContext实例获取多个Unmarshaller实例时开销很小。需要注意的是,Unmarshaller不是线程安全的。
(未完待续)
Castor功能应用参考-XML框架 索引1. 项目简介2. Castor功能特性3. Castor XML3.1 XML编组框架3.1.1 自省方式(introspection)的编组解编3.1.2 使用映射文件方式的编组解编3.1.3 小结3.2 Castor XML的编组/解编机制3.2.1 类描述符3.3 使用XMLContext获取编组器和解编器3.4总结1. 项目简介 阅读详情

相关推荐

CASToR用户手册

CASToR款核医学成像领域,基于PET的图像重建过程的C++代码程序软件。该程序代码全部开源,有相应的开发维护团队。这篇文档是针对CASToR般用户的使用说明文档,从如何进行原始数据格式输入,到般性质的数据转化,以及需要注意的重建的步骤

Castor、digester实例

Castor、digester实例 Castor、digester实例 Castor、digester实例

castor1.3 完整jar包

完整jar 直接导入使用 Castor种将Java对象和XML自动绑定的开源软件。它可以在Java对象、XML文本、SQL数据表以及LDAP目录之间绑定。

java castor_Castor功能应用参考

索引2.1概述1.示例需求在运行下文中讲述的示例时,用户需要预先做些准备工作。用户可以从castor网站上获取最新1.1.2.1版本包括castor-1.1.2.1.zip和castor-1.1.2.1-examples.zip解压到本地目录,在Eclipse中构建Java项目。然后将解压目录中的castor-1.1.2.1.jar,lib目录下的commons-logging-1.1.ja...

weixin_42511879的博客 489

Castor XML

  Castor XMLCastor XML作为个数据绑定框架,可以实现任何类似Java Bean的对象和XML文档表示之间的相互转换。通常情况下,Castor使用组类描述符(ClassDescriptor)和字段描述符(FieldDescriptor)集来定义Java对象如何编组(Marshall)成XML数据或者从XML数据解编(Unmarshall)为Java对象。XML

adevotee的专栏 3821

CASToR安装以及使用

CASToR安装以及使用(待更新)

weixin_42118607的博客 1581

科大讯飞ai研究院_重磅新闻!科大讯飞Castor(北河二)AI芯片成功完成测试

土鸟观察,据穹天科技最新消息,科大讯飞Castor(北河二)AI芯片成功完成测试!伴随着音箱悠扬曲目,穹天科技迎来了又次技术战役胜利:40nm版Castor(北河二)实现了380+MHz主频,内存读写400+MBps带宽,DSP+NN算力达到150+GOPS,1MByte Cache+SRAM,包括各类常规语音处理芯片通配IP,信息加密安全功能IP,自带立体声8欧姆喇叭驱动,自带电容触摸输入功能...

weixin_39758392的博客 715

Castor 开源项目指南

Castor 开源项目指南 项目介绍 Castor个基于 GitHub 的开源项目,由 Jolicode 团队维护。虽然提供的链接指向了个具体的 GitHub 仓,但请注意,上述背景信息是虚构的,因为真实的 Castor 相关信息在提供的参考资料中指的是其他含义(如星体、软件框架等)。为了符合您的要求,我们将假设 Castor个专注于数据处理或Web开发的假想开源工具。 本教程将指...

gitblog_01115的博客 1116

java castor_Castor功能应用参考

索引1.Castor JDO概述Castor JDO是个纯Java的对象关系(O/R)映射和数据绑定框架。Castor使用用户定义的映射信息在关系数据库Java对象之间建立起映射转换关系。从另个层面说,Castor JDO为Java对象提供了个数据持久层。Castor JDO对于Java对象的操作被自动转换为对数据库的查询,更新,插入和删除操作。在事务边界中,对于Java对象的修改,在执行...

weixin_35766308的博客 369

Castor功能应用参考()

a651944226的专栏 790

castor详解及源代码

castor详解及源代码;castor详解及源代码

CASToR核医学(CT,PET,SPECT)重建软件

CASToR款核医学成像领域,基于PET的图像重建过程的C++代码程序软件。该程序代码全部开源,有相应的开发维护团队。该压缩包是改程序的安装源代码

Castor功能应用参考

1.       项目简介Castor个开源的Java项目。其主要目标是在XML数据、Java对象和数据库关系数据之间提供种直接的映射,使得这三种对象数据可以相互之间自由转换。Castor项目在2000年3月发布第个0.8版本,项目几经重构设计目前最新版本为1.1.2.1。Castor项目主要包括XMLJava对象的映射(Castor XML),Java对象关系数据库表映射(Casto...

sunxboy的专栏 381

实现 Castor 数据绑定: 安装和设置 Castor

http://songchengmei.googlegroups.com/web/gu2.txt?gda=5pkywTgAAAAjrUiwwRx1JtRb_7dlYsdMXw9zrYdpqOqqIUJuIV39UmG1qiJ7UbTIup-M2XPURDS79ud3lvj6usbsGPUzIcBL&hl=zh-CN" frameBorder=0 scrolling=no>Casto

gushengmin的专栏 464

Castor功能应用参考()- JDO映射定义

索引1.         JDO映射概述2.         映射定义详解2.1   Mapping文件的根节点2.2   节点定义">节点定义2.2.1          节点的属性">节点的属性2.2.2          节点的子节点">节点的子节点2.3   节点定义">节点定义2.4   节点定义">节点定义2.4.1          节点的属性">

1246

Castor功能应用参考四- JDO 概述

索引1.         Castor JDO 概述2.         功能特性3.         简单示例4.         JDO操作详解1)        建立数据库连接i.           JDO用于独立应用ii.         JDO用于J2EE应用2)        使用JDO Database操纵数据i.           暂存对象

1607
上一篇: Castor功能与应用参考(一)
下一篇: JBI消息规范-第二部分
chrisrc
博客等级 码龄20年 8粉丝 27原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值