三、实现数据绑定
实现数据绑定,主要包括编组和解组两个过程。编组就是将JAVA对象转化为XML;解组就是将XML数据转化为JAVA对象。
对应生成类和映射文件分别采用不同的编组解组过程。
1、生成类的编组和解组。这类比较简单,因为在生成类时,已经自动根据Schema自动生成了编组解组的对应方法,直接调用即可。
Parser3.java
package com.raistlin.test.castor;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.StringWriter;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.ValidationException;
public class Parser3
{
public Alarm unMarshller() throws MarshalException, ValidationException,
FileNotFoundException
{
Alarm alarm = null;
// 解组
alarm = Alarm.unmarshal(new FileReader("d:/Alarm.xml"));
return alarm;
}
public String marshller(Alarm alarm) throws MarshalException,
ValidationException
{
StringWriter alarmStr = new StringWriter();
// 编组
alarm.marshal(alarmStr);
return alarmStr.toString();
}
public static void main(String[] args) throws Exception
{
Parser3 parser = new Parser3();
Alarm alarm = parser.unMarshller();
String alarmStr = parser.marshller(alarm);
System.out.println(alarmStr);
}
}
2、映射文件的编组和解组。
Parser4.java
package com.raistlin.test.castor;
import java.io.IOException;
import java.io.StringWriter;
import java.sql.Timestamp;
import java.util.Calendar;
import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.Unmarshaller;
import org.exolab.castor.xml.ValidationException;
import org.xml.sax.InputSource;
public class Parser4
{
public Alarm unMarshal() throws IOException, MappingException,
MarshalException, ValidationException
{
Alarm alarm = null;
// 初始化映射规则
Mapping mapping = new Mapping();
mapping.loadMapping("d:/AlarmMapping.xml");
// 解组
Unmarshaller unMarshaller = null;
unMarshaller = new Unmarshaller(mapping);
alarm = (Alarm) unMarshaller.unmarshal(new InputSource(
"d:/Alarm.xml"));
return alarm;
}
public String marshal(Alarm alarm) throws IOException, MappingException,
MarshalException, ValidationException
{
StringWriter alarmStr = new StringWriter();
// 初始化映射规则
Mapping mapping = new Mapping();
mapping.loadMapping("d:/AlarmMapping.xml");
// 编组
Marshaller marshaller = null;
marshaller = new Marshaller(alarmStr);
marshaller.setEncoding("GB2312");
marshaller.setMapping(mapping);
marshaller.marshal(alarm);
return alarmStr.toString();
}
public static void main(String[] args) throws Exception
{
Parser4 parser = new Parser4();
Alarm alarm = parser.unMarshal();
String alarmStr = parser.marshal(alarm);
System.out.println(alarmStr);
}
}
最后说一下需要注意的地方。
使用生成类,虽然简单方便,但仍然会有一些缺点。比如部分代码大量重复,不够精练高效;生成代码可能会存在错误(我用过的错误最多的生成代码工具应该是AXIS,Castor似乎还好);对代码生成工具产生依赖性,因生成工具的稳定性、标准化程度的影响,会给项目带来一些风险;增加维护工作的难度,比如BUG的跟踪,patch的维护等。所在使用生成类时,一定要注意尽量在模型设计完善后,再生成,保持生成类的稳定性,不要做太多的修改。另外,对于修改过的生成类,要将修改部分详细记入维护文档,以方便后来的维护人员维护,包括,将代码重新生成后的恢复原貌、故障问题跟踪以及版本控制等。
对于映射文件来说,最好先对已有类的字段数据类型做些测试,确保Castor能完全支持。