替代@XmlSeeAlso

时间:2013-06-05 08:59:23

标签: java jaxb

abstract Class A{

}


Class B extends A{

}


@XmlRootElement
Class C {
   @XmlElement(name = "tobeserialized")
   A tobeserialized;
}


Class D{
 public void marshal(){
 C all = getData();
 JAXB.marshal(all, new File("saved.xml");

  }

}

让JAXB知道类B是类A的子类,我需要在类A上放置@XmlSeeAlso(value = {B.class})。我们有大约50个A的子类。

但项目依赖性使得A类位于无法访问B类的包中。所以我不能将注释放在A类上。

可以选择哪种方法,以便JAXB可以序列化A类的子类?

2 个答案:

答案 0 :(得分:3)

映射继承关系时不需要@XmlSeeAlso注释,但这是最经常使用的时候。 @XmlSeeAlso的作用是告诉JAXB引入并生成无法通过遍历类推断出的类的元数据。

在您的示例中,如果您仅在JAXBContext类(C)上创建了JAXBContext.newInstance(C.class),那么A类也会因tobeserialized而被处理} field,但是B不会,因为Java中没有一种机制来查找子类。您可以通过将@XmlSeeAlso(B.class)放在A上或通过将子类包含在用于引导JAXBContext的类中来解决此问题:

JAXBContext.newInstance(B.class, C.class);

答案 1 :(得分:0)

对我来说很长一段时间,但您可以尝试在A级添加@XmlTransient,在B级添加@XmlType

或者在类A和B上@XmlTransient(因为它们是抽象的)并将@XmlType添加到具体的子类中。