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");
}
}
para que JAXB sepa que la clase B es una subclase de la clase A, necesitaría poner un @XmlSeeAlso (value = {B.class}) en la clase A. Tenemos alrededor de 50 subclases de A.
Pero la dependencia del proyecto es tal que la Clase A se encuentra en un paquete que no puede acceder a la Clase B. Por lo tanto, no puedo poner la anotación en la Clase A.
¿Cuáles pueden ser las alternativas a considerar, para que JAXB pueda serializar las subclases de la Clase A?
Respuestas
3 para la respuesta № 1los @XmlSeeAlso
la anotación no se requiere al mapear una relación de herencia, pero es cuando más se usa. La función de @XmlSeeAlso
es decirle a JAXB que introduzca y produzca metadatos para las clases que no se pueden inferir al atravesar la clase.
En tu ejemplo si creaste el JAXBContext
sólo en el C
clase (JAXBContext.newInstance(C.class)
) entonces el A
clase también sería procesada debido a la tobeserialized
campo, pero B
no lo haría porque no hay un mecanismo en Java para encontrar subclases. Podrías resolver esto poniendo @XmlSeeAlso(B.class)
en A
o incluyendo las subclases en las clases utilizadas para arrancar el JAXBContext
:
JAXBContext.newInstance(B.class, C.class);
0 para la respuesta № 2
Ha pasado mucho tiempo para mí, pero puede intentar agregar @XmlTransient
en la clase A y @XmlType
en la clase B.
O @XmlTransient
en las clases A y B (ya que son abstractas) y agregar @XmlType
Subclases concretas.