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");
}
}
aby JAXB wiedział, że klasa B jest podklasą klasy A, musiałbym umieścić @XmlSeeAlso (wartość = {B.class}) w klasie A. Mamy około 50 podklas A.
Ale zależność projektu jest taka, że klasa A leży w pakiecie, który nie ma dostępu do klasy B. Nie mogę więc umieścić adnotacji w klasie A.
jakie mogą być alternatywy, aby JAXB mógł serializować podklasy klasy A?
Odpowiedzi:
3 dla odpowiedzi № 1The @XmlSeeAlso
adnotacja nie jest wymagana podczas mapowania relacji dziedziczenia, ale wtedy jest najczęściej używana. Rola @XmlSeeAlso
jest powiedzenie JAXB, aby wciągało i produkowało metadane dla klas, których nie można wywnioskować z przechodzenia przez klasę.
W twoim przykładzie, jeśli stworzyłeś JAXBContext
po prostu C
klasa (JAXBContext.newInstance(C.class)
) a później A
klasa będzie również przetwarzana z powodu tobeserialized
pole, ale B
nie byłoby t, ponieważ w Javie nie ma mechanizmu do wyszukiwania podklas. Możesz rozwiązać ten problem przez wprowadzenie @XmlSeeAlso(B.class)
na A
lub przez włączenie podklas w klasach używanych do ładowania początkowego JAXBContext
:
JAXBContext.newInstance(B.class, C.class);
0 dla odpowiedzi nr 2
Minęło wiele czasu, ale możesz spróbować dodać @XmlTransient
w klasie A i @XmlType
w klasie B.
Lub @XmlTransient
w klasach A i B (ponieważ „są abstrakcyjne”) i dodać @XmlType
do konkretnych podklas.