引子
xsd中的complexType在JAXB中對應XmlType,element在JAXB中對應XmlRootElement。而xml序列化(marshal)和反序列化(unmarshal)的對象是element而不是type,所以在JAXB中XmlType無法被直接序列化,只能通過xsd定義element或者如通過Annotation聲明XmlRootElement來完成。
比如,我們的xsd中定義爲
要想序列化上面的Admin
- 一種方式是定義xml element
- 另外一種方式是使用Annotaion。比如聲明一個Wrapper類AdminElement
假如我們的類很有多,除了Admin,還有Company, Employee, User, Device, Job, Event,...而且在XSD中都只定義了xml type而沒有定義xml element。這時序列化這些對象,爲每個類都聲明一個wrapper類,顯得很繁瑣。
- 泛型和模板
- 反射
- 代碼生成器(cglib, asm),自動生成code
解決
我們採用的第一種:泛型和模板。代碼如下:
marshal
利用非Annotation的JAXBElement來聲明element(javadoc: JAXB representation of an Xml Element),然後序列化此JAXBElement對象。
unmarshal
同樣是需要使用JAXBElement.所以使用的方法是帶有declaredType的unmarshall
Test
成對的API是比較好測試的,測試如下:
- 創建一個實例
- 將其序列化爲xml
- 將xml反序列化成實例對象
- 比較兩個實例
參考
http://jaxb.java.net/guide/_XmlRootElement_and_unmarshalling.html