@XmlSeeAlso替代
我有以下内容:
class A{ @XmlElement
String name;
//getters and setters
}
和
class B extends A{ @XmlElement
String height;
//getters and setters
}
终于我有了
@XmlRootElementclass 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元帅,我只是把田野当作事物的一部分,而不是高度。
我知道我可以在A中添加@XmlSeeAlso(B.class),这一切都可以。
但是问题是我不知道B以外的所有扩展类,因为A可能在运行时扩展。
如何在运行时动态定义@XmlSeeAlso?
回答:
这取决于您如何创建JAXBContext。该newInstance方法可以与所有的类的显式列表被调用,该方法的文档也给出了类似的例子。
客户端应用程序必须提供新上下文对象需要识别的类的列表。新上下文不仅会识别所有指定的类,而且还将识别从指定类直接/间接静态引用的任何类。引用类的子类或@XmlTransient引用类的子类均未在JAXBContext中注册。例如,在以下Java代码中,如果执行newInstance(Foo.class),则新创建的JAXBContext将识别Foo和Bar,但不能识别Zot或FooBar:
class Foo { @XmlTransient FooBar c;
Bar b;
}
class Bar { int x; }
class Zot extends Bar { int y; }
class FooBar { }
如果您至少知道潜在jaxb类的程序包名称,则还可以给定上下文路径来创建上下文。
如果上述方法不可行,您还可以在运行时根据要序列化的对象创建类列表。我认为最好尝试重构您的代码以使其不必要。以下代码未经测试:
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()]));
以上是 @XmlSeeAlso替代 的全部内容, 来源链接: utcz.com/qa/428862.html