“好吧,那麼。你可能已經猜到了,這還不是全部。”

“現在我將向您介紹 JAXB 的其他幾個方面。但正如我們對 JSON 所做的那樣,我們將從集合開始。”

“當使用 JAXB 反序列化集合時,也不確定將哪個特定集合(ArrayList、LinkedList、Vector 等)用於 List 變量。這個問題的答案同樣由註釋提供。”

“這一切都非常簡單。如果在其註釋中未指定集合類型,那麼 JAXB 將嘗試使用其類型選擇最合適的集合。對於 List,這將是 ArrayList;對於 Map,它將是 HashMap,等等”

“實際上,這裡的問題比 JSON 少得多,因為每個類都有一個唯一的標籤,您可以使用標籤來指定確切的類。”

“例如,如果您需要反序列化一組繼承了共同祖先的元素,您可以使用 @XmlAny:註釋”

從 XML 轉換對象
public static void main(String[] args) throws JAXBException
{
 String xmldata = "<zoo><cat/><cat/><dog/><cat/></zoo>";
 StringReader reader = new StringReader(xmldata);

 JAXBContext context = JAXBContext.newInstance(Cat.class, Zoo.class, Dog.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 Cat cat = (Cat) unmarshaller.unmarshal(reader);
}
其對像從 XML 反序列化的類
@XmlType(name = "zoo") 
@XmlRootElement 
class  Zoo 
{ 
@XmlAny public  List<Object> animals; } 
 


@XmlType(name = "cat") 
@XmlRootElement 
class  Cat 
{ 
public  String name; 公共 年齡;公共 重量; 
 
 

 貓()
 { 
 } 
}

@XmlType(name = "dog") 
@XmlRootElement 
class  Dog 
{ 
public  String name; 公共 年齡;公共 重量; 
 
 

 貓()
 { 
 } 

“如果集合標有@XmlAny註釋,那麼任何合適的對像都可以放入其中。JAXB Unmarshaller在填充集合時會注意標籤。”

"在這種情況下,標籤序列“ <zoo> <cat/> <cat/> <dog/> <cat/> </zoo> ”將被轉換為包含 Cat、Cat、Dog 和 Cat 對象的集合”

“這正是我所期望的。”

“嗯嗯。哦,對了,還有一件事。如果反序列化文本和標籤的混合,則需要使用@XmlMixed註解。”

“這是此類 XML 的示例:”

需要 @XmlMixed 註釋的示例 XML
<data> 
<items> 
test 1 <item/> text 2 <item> name </item> text 3 </items> </data> 

 

 

 

“哇。我忘記了這樣的 XML 存在。我已經習慣了所有漂亮的東西,嵌入的標籤,以及其他一切。”

“它確實存在。而且 JAXB 即使在這種情況下也有註釋!”

“太好了。順便問一下:枚舉是如何序列化的?”

“好問題!好問題!我不知何故跳過了那個話題。”

“有一個特殊的 @XmlEnum 註釋必須用於標記枚舉。您可以使用它來指定值將存儲為數字還是字符串。”

“還有一個 @XmlEnumValue 註釋,可讓您指定與特定枚舉字段對應的值。”

“這裡有些例子:”

數字 字符串
@XmlType
@XmlEnum(Integer.class)
public enum Code
{
 @XmlEnumValue("1")
  START,

 @XmlEnumValue("2")
  INPROGRESS,

 @XmlEnumValue("3")
  FINISH

 @XmlEnumValue("-1")
  ERROR
}
@XmlType
@XmlEnum(String.class)
public enum Card
{
 @XmlEnumValue("Spade")
  CLUBS,

 @XmlEnumValue("Diamond")
  DIAMONDS,

 @XmlEnumValue("Heart")
  HEARTS,

 @XmlEnumValue("Club")
  SPADES
}

“我的天啊。我無法想像我會在哪裡需要它,但我認為它非常有用。最重要的是,我不必堅持使用標準字符串或數值。”

“是的。這很方便,例如,當你編寫一個與 Facebook 服務器交換消息的程序時,它們有一組分配的值。你只需要將它們分配給它們自己的枚舉,一切都會起作用。 “

“太好了。我絕對喜歡 JAXB。”

“太好了,今天就到這裡,你去休息吧。”