A generic JAXB marshal/unmarshal XmlType

引子

xsd中的complexType在JAXB中對應XmlTypeelement在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類,顯得很繁瑣。

 

 

解決這類問題,進行代碼去重的一般思路是
  1. 泛型和模板
  2. 反射
  3. 代碼生成器(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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章