Castor XML是一種XML數(shù)據(jù)綁定框架。
XML的另外兩種主要API:DOM和SAX(Document Object Model和Simple API for XML),主要是從結(jié)構(gòu)的角度去處理XML文件,而Castor XML是以對(duì)象的模式去處理XML文檔中的數(shù)據(jù)
大多數(shù)情況下,轉(zhuǎn)換框架通過ClassDescriptor和FieldDescriptor來描述轉(zhuǎn)換時(shí)所需要的信息。
二、 轉(zhuǎn)換框架
轉(zhuǎn)換框架中最主要的兩個(gè)類是:org.exolab.castor.xml.Marshaller和org.exolab.castor.xml.Unmarshaller
marshal: Marshaller.marshal(obj,writer);
unmarshal: Unmarshaller.unmarshal(Person.class,reader);
上面的這種轉(zhuǎn)換方式,只適合于按照默認(rèn)方式進(jìn)行轉(zhuǎn)化,如果要使用映射文件,需要采用以下方式。
marshal:
Mapping mapping = new Mapping();
mapping.loadMapping(“mapping.xml”);
Marshaller marshaller = new Marshaller(writer);
marshaller.setMapping(mapping);
marshaller.marshal(obj);
Marshaller的5個(gè)marshal方法中,只有marshal(Object obj)這個(gè)方法不是靜態(tài)的,其他的四個(gè)都是靜態(tài)的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作為構(gòu)造Unmarshaller的參數(shù)
unm.setMapping(mapping);
Person person = (Person)unm.unmarshal(reader);
Unmarshaller中,object可以從reader中轉(zhuǎn)換而來,也可以從source、node轉(zhuǎn)換而來,靜態(tài)方法均是兩個(gè)參數(shù),非靜態(tài)方法都是一個(gè)來源作為參數(shù)。
三、 使用存在的Class和對(duì)象
Castor幾乎可以將任何對(duì)象和XML進(jìn)行轉(zhuǎn)換。當(dāng)指定class的描述文件不存在時(shí),轉(zhuǎn)換框架使用默認(rèn)的reflection機(jī)制來獲得對(duì)象的信息。
轉(zhuǎn)化對(duì)象存在的主要約束是:
這些class必須有一個(gè)public而且default的構(gòu)造函數(shù);必須有adequate get/set方法。
四、 類描述符(ClassDescriptor)
org.exolab.castor.xml.XMLClassDescriptor
類描述符提供轉(zhuǎn)換時(shí)所需的必要信息。ClassDescriptor不僅可以用于Castor XML,還可以用于Castor JDO
類描述符包括一組字段描述符(FieldDescriptor)
類描述符通常情況下有四種創(chuàng)建方式,兩種在編譯時(shí)(效率較高),兩種在運(yùn)行時(shí)(較為方便)
編譯時(shí)描述符:
1. 讓需要被describe的類實(shí)現(xiàn)org.exolab.castor.xml.XMLClassDescriptor接口
2. 使用Source Code Generator創(chuàng)建合適的descriptor
運(yùn)行時(shí)描述符:
3. 默認(rèn),使用Castor的introspect機(jī)制
4. 提供mapping文件,或者默認(rèn)和配置文件并用
使用”default introspection”機(jī)制必須為每一個(gè)要轉(zhuǎn)換的field配備對(duì)應(yīng)的get/set方法;
如果沒有g(shù)et/set方法,但是是public的field,也可以以direct field access的方式被轉(zhuǎn)換;
但是如果一個(gè)類中為有的成員定義了get/set方法,即使其他成員是public的,也不會(huì)被轉(zhuǎn)換;
自動(dòng)內(nèi)省機(jī)制是自動(dòng)觸發(fā)的。可以通過castor.properties文件控制自動(dòng)轉(zhuǎn)換的特性,比如改變名稱轉(zhuǎn)換、基本型別是轉(zhuǎn)換為attribute還是element等。
Mapping文件也可以用來描述要被轉(zhuǎn)換的類。mapping的裝載發(fā)生在marshal和unmarshal之前(org.exolab.castor.mapping.Mapping)