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");
}
}
pre JAXB vedieť, že trieda B je podtrieda triedy A, musela by som vložiť @XmlSeeAlso (value = {B.class}) do triedy A. Máme okolo 50 podtried A.
Ale závislosť projektu je taká, že trieda A leží v balíku, ktorý nemá prístup k triede B. Takže nemôžem dať anotáciu do triedy A.
čo môžu byť alternatívy, na ktoré sa môžete pozrieť, takže JAXB môže serializovať podtriedy triedy A?
odpovede:
3 pre odpoveď č. 1Na @XmlSeeAlso
anotácia nie je potrebná pri mapovaní dedičského vzťahu, ale je to vtedy, keď sa používa najčastejšie. @XmlSeeAlso
je povedať JAXB, aby vytiahol a vyrobil metaúdaje pre triedy, ktoré nemôžu byť odvodené z prechodu triedy.
Vo vašom príklade, ak ste vytvorili JAXBContext
len na C
trieda (JAXBContext.newInstance(C.class)
) potom A
trieda by bola spracovaná aj kvôli tobeserialized
oblasti, ale B
wouldn "t, pretože tam nie je" mechanizmus v jazyku Java nájsť podtriedy. Dalo by sa to vyriešiť uvedením @XmlSeeAlso(B.class)
na A
alebo zahrnutím podtried do tried používaných na bootstrap JAXBContext
:
JAXBContext.newInstance(B.class, C.class);
0 pre odpoveď č. 2
Bol to pre mňa dlhý čas, ale môžete sa pokúsiť pridať @XmlTransient
pre triedu A a @XmlType
v triede B.
alebo @XmlTransient
na triedach A a B (pretože sú abstraktné) a pridávajú sa @XmlType
na konkrétne podtriedy.