“好吧,那么。你可能已经猜到了,这还不是全部。”

“现在我将向您介绍 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。”

“太好了,今天就到这里,去休息吧。”