“好吧,那么。你可能已经猜到了,这还不是全部。”
“现在我将向您介绍 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