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类的子类?
答案 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
添加到具体的子类中。