Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1086911
  • 博文数量: 282
  • 博客积分: 10865
  • 博客等级: 上将
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-12 12:35
文章存档

2017年(1)

2016年(3)

2015年(10)

2014年(12)

2013年(5)

2012年(10)

2011年(29)

2010年(3)

2008年(13)

2007年(92)

2006年(104)

我的朋友

分类: Java

2007-05-23 13:38:20

使用Castor XML
一、 简介
Castor XML是一种XML数据绑定框架。
XML的另外两种主要API:DOM和SAX(Document Object Model和Simple API for XML),主要是从结构的角度去处理XML文件,而Castor XML是以对象的模式去处理XML文档中的数据

大多数情况下,转换框架通过ClassDescriptor和FieldDescriptor来描述转换时所需要的信息。

二、 转换框架
转换框架中最主要的两个类是:org.exolab.castor.xml.Marshaller和org.exolab.castor.xml.Unmarshaller

marshal: Marshaller.marshal(obj,writer);
unmarshal: Unmarshaller.unmarshal(Person.class,reader);

上面的这种转换方式,只适合于按照默认方式进行转化,如果要使用映射文件,需要采用以下方式。
marshal:
Mapping mapping = new Mapping();
mapping.loadMapping(“mapping.xml”);
Marshaller marshaller = new Marshaller(writer);
marshaller.setMapping(mapping);
marshaller.marshal(obj);
Marshaller的5个marshal方法中,只有marshal(Object obj)这个方法不是静态的,其他的四个都是静态的marshal(obj,writer), marshal(obj,handler), marshal(obj,node)

unmarshal:
Mapping mapping = new Mapping();
mapping .loadMapping(“mapping.xml”);
Unmarshaller unm = new Unmarshaller(“Person.class”);//使用Person.class作为构造Unmarshaller的参数
unm.setMapping(mapping);
Person person = (Person)unm.unmarshal(reader);
Unmarshaller中,object可以从reader中转换而来,也可以从source、node转换而来,静态方法均是两个参数,非静态方法都是一个来源作为参数。

三、 使用存在的Class和对象
Castor几乎可以将任何对象和XML进行转换。当指定class的描述文件不存在时,转换框架使用默认的reflection机制来获得对象的信息。

转化对象存在的主要约束是:
这些class必须有一个public而且default的构造函数;必须有adequate get/set方法。

四、 类描述符(ClassDescriptor)
org.exolab.castor.xml.XMLClassDescriptor
类描述符提供转换时所需的必要信息。ClassDescriptor不仅可以用于Castor XML,还可以用于Castor JDO

类描述符包括一组字段描述符(FieldDescriptor)

类描述符通常情况下有四种创建方式,两种在编译时(效率较高),两种在运行时(较为方便)
编译时描述符:
1. 让需要被describe的类实现org.exolab.castor.xml.XMLClassDescriptor接口
2. 使用Source Code Generator创建合适的descriptor
运行时描述符:
3. 默认,使用Castor的introspect机制
4. 提供mapping文件,或者默认和配置文件并用

使用”default introspection”机制必须为每一个要转换的field配备对应的get/set方法;
如果没有get/set方法,但是是public的field,也可以以direct field access的方式被转换;
但是如果一个类中为有的成员定义了get/set方法,即使其他成员是public的,也不会被转换;
自动内省机制是自动触发的。可以通过castor.properties文件控制自动转换的特性,比如改变名称转换、基本型别是转换为attribute还是element等。

Mapping文件也可以用来描述要被转换的类。mapping的装载发生在marshal和unmarshal之前(org.exolab.castor.mapping.Mapping)

阅读(2073) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~