“好吧,那麼。你可能已經猜到了,這還不是全部。”
“現在我將向您介紹 JAXB 的其他幾個方面。但正如我們對 JSON 所做的那樣,我們將從集合開始。”
“當使用 JAXB 反序列化集合時,也不確定將哪個特定集合(ArrayList、LinkedList、Vector 等)用於 List 變量。這個問題的答案同樣由註釋提供。”
“這一切都非常簡單。如果在其註釋中未指定集合類型,那麼 JAXB 將嘗試使用其類型選擇最合適的集合。對於 List,這將是 ArrayList;對於 Map,它將是 HashMap,等等”
“實際上,這裡的問題比 JSON 少得多,因為每個類都有一個唯一的標籤,您可以使用標籤來指定確切的類。”
“例如,如果您需要反序列化一組繼承了共同祖先的元素,您可以使用 @XmlAny:註釋”
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);
}
@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 的示例:”
<data> <items> test 1 <item/> text 2 <item> name </item> text 3 </items> </data>
“哇。我忘記了這樣的 XML 存在。我已經習慣了所有漂亮的東西,嵌入的標籤,以及其他一切。”
“它確實存在。而且 JAXB 即使在這種情況下也有註釋!”
“太好了。順便問一下:枚舉是如何序列化的?”
“好問題!好問題!我不知何故跳過了那個話題。”
“有一個特殊的 @XmlEnum 註釋必須用於標記枚舉。您可以使用它來指定值將存儲為數字還是字符串。”
“還有一個 @XmlEnumValue 註釋,可讓您指定與特定枚舉字段對應的值。”
“這裡有些例子:”
數字 | 字符串 |
---|---|
|
|
“我的天啊。我無法想像我會在哪裡需要它,但我認為它非常有用。最重要的是,我不必堅持使用標準字符串或數值。”
“是的。這很方便,例如,當你編寫一個與 Facebook 服務器交換消息的程序時,它們有一組分配的值。你只需要將它們分配給它們自己的枚舉,一切都會起作用。 “
“太好了。我絕對喜歡 JAXB。”
“太好了,今天就到這裡,你去休息吧。”
GO TO FULL VERSION