ऐसा लगता है कि जेएक्सबी जो लिखता है उसे पढ़ नहीं सकता है। निम्नलिखित कोड पर विचार करें:जेएक्सबी इंटरफेस की अनारशनल सूची नहीं है
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());
}
यह एक सरल उदाहरण है, ज़ाहिर है। मुद्दा यह है कि मुझे एक संग्रह में दो अलग-अलग लागू कक्षाओं, बार और बाज को स्टोर करना होगा। खैर, मैंने देखा कि उनके पास बहुत ही समान सार्वजनिक इंटरफ़ेस है, इसलिए मैंने एक इंटरफ़ेस IFoo बनाया और इसे लागू करने के लिए उन्हें दो बना दिया। अब, मैं इस संग्रह को एक्सएमएल से/सहेजने के लिए टूल्स रखना चाहता हूं। दुर्भाग्य से, यह कोड काफी काम नहीं करता है: संग्रह सहेजा गया है, लेकिन फिर इसे लोड नहीं किया जा सकता है! इरादा उत्पादन
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
जाहिर है, मैं एक अलग तरीके से व्याख्या का उपयोग करने की आवश्यकता है? या जेएक्सबी पर छोड़ने और कुछ और देखने के लिए? मैं, अच्छी तरह से, सभी वर्गों के लिए "XMLNode toXML()" विधि लिख सकता हूं (डी) मार्शल, लेकिन ...
@XmlSeeAlso –
की संभावित डुप्लिकेट के उपयोग के लिए प्रलेखन चेक http://stackoverflow.com/questions/4144296/marshalling -ए-सूची-ऑब्जेक्ट-साथ-जैक्सब, जो एक इंटरफ़ेस प्रकार की सूची के बारे में भी पूछता है, और स्वीकार्य उत्तर में एक अलग, कामकाजी दृष्टिकोण है। –