我有以下几点:
class A{
@XmlElement
String name;
//getters and setters
}
和
class B extends A{
@XmlElement
String height;
//getters and setters
}
终于我有了
@XmlRootElement
class P{
@XmlElement
List<A> things;
//getters and setters
}
如果我做
List<A> l = new ArrayList<A>();
l.add(new B('hello', 20)) //Add new B with height of 20 and name hello
P p = new P();
p.setThings(l); //Set things to list of B's.
和P编码(marshal),我只是把田野作为事物的一部分,而不是高度。
我知道我可以在A中添加@XmlSeeAlso(B.class),这一切都可以。
但是问题是我不知道B以外的所有扩展类,因为A可能在运行时扩展。
如何在运行时动态定义@XmlSeeAlso?
最佳答案
这取决于您如何创建JAXBContext。可以使用所有类的显式列表来调用newInstance method,该方法的文档也提供了类似的示例。
class Foo {
@XmlTransient FooBar c;
Bar b;
}
class Bar { int x; }
class Zot extends Bar { int y; }
class FooBar { }
编辑:如果您至少知道潜在的jaxb类的软件包名称,则也可以create a context given a context path。
如果上述方法不可行,您还可以在运行时根据要序列化的对象创建类列表。我认为最好尝试重构您的代码以使其不必要。以下代码未经测试:
Set<Class> classes = new HashSet<Class>();
classes.add(p.getClass());
for (A a : p.getThings()) {
classes.add(a.getClass());
}
JAXBContext context = JAXBContext.newInstance(classes.toArray(new Class[classes.size()]));