看來JAXB無法讀取它寫入的內容。考慮下面的代碼:JAXB不解組接口列表
interface IFoo {
void jump();
}
@XmlRootElement
class Bar implements IFoo {
@XmlElement
public String y;
public Bar() {
y = "";
}
public Bar(String y) {
this.y = y;
}
@Override
public void jump() {
System.out.println(y);
}
}
@XmlRootElement
class Baz implements IFoo {
@XmlElement
public int x;
public Baz() {
x = 0;
}
public Baz(int x) {
this.x = x;
}
@Override
public void jump() {
System.out.println(x);
}
}
@XmlRootElement
public class Holder {
private List<IFoo> things;
public Holder() {
things = new ArrayList<>();
}
@XmlElementWrapper
@XmlAnyElement
public List<IFoo> getThings() {
return things;
}
public void addThing(IFoo thing) {
things.add(thing);
}
}
// ...
try {
JAXBContext context = JAXBContext.newInstance(Holder.class, Bar.class, Baz.class);
Holder holder = new Holder();
holder.addThing(new Bar("1"));
holder.addThing(new Baz(2));
holder.addThing(new Baz(3));
for (IFoo thing : holder.getThings()) {
thing.jump();
}
StringWriter s = new StringWriter();
context.createMarshaller().marshal(holder, s);
String data = s.toString();
System.out.println(data);
StringReader t = new StringReader(data);
Holder holder2 = (Holder)context.createUnmarshaller().unmarshal(t);
for (IFoo thing : holder2.getThings()) {
thing.jump();
}
}
catch (Exception e) {
System.err.println(e.getMessage());
}
這是一個簡單的例子,當然。關鍵是我必須在一個集合中存儲兩個非常不同的實現類Bar和Baz。那麼,我觀察到他們有非常相似的公共接口,所以我創建了一個接口IFoo並使他們兩個來實現它。現在,我想要有工具來保存這個集合並從XML載入。不幸的是,這段代碼並不完全正常工作:集合被保存,但不能被加載!預期的輸出是
1
2
3
some xml
1
2
3
但不幸的是,實際產量
1
2
3
some xml
com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to testapplication1.IFoo
很顯然,我需要使用註釋以不同的方式?或者放棄JAXB並尋找其他東西?我可以寫出「XMLNode toXML()」方法,用於所有我不想(de)元帥的類,但是...
檢查的@XmlSeeAlso –
可能重複的使用文檔http://stackoverflow.com/questions/4144296/marshalling -a-list-of-objects-with-jaxb,它也詢問關於接口類型的列表,並且在接受的答案中具有不同的工作方法。 –