2012-03-28 19 views
5

Me pregunto si hay soporte para las diferentes versiones de clase en JAXB. Lo que pienso al respecto: xml es una clase de persistencia objeto de clase (valor serializado) pero el objeto de clase puede cambiarse debido al desarrollo (por ejemplo, ampliando la funcionalidad). ¿Hay alguna forma de saber qué versión de la clase se almacena en persistencia (leer: xml) usando solo JAXB API?JAXB y diferentes versiones de la clase

Para mí, parece conveniente almacenar la versión de clase, como se hace en el mecanismo de serialización Java estándar (me refiero serialVersionUID) y proporciona funcionalidad para asignar xml en la clase incluso en el caso de versiones diferentes (por ejemplo, agregar XmlAdapter información sobre la versión de clase almacenada en xml). De forma predeterminada, si la versión de clase en xml y en tiempo de ejecución es diferente, ejecute InvalidClassException.

Ejemplo: Tenemos clase Test de la siguiente manera:

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private Long time; 

    private Test() {}; 
} 

suponiendo que el tiempo es el tiempo de UNIX en Millis.

Este código fue lanzado en producción y esta clase se conservó en la base de datos como xml. liberación siguiente muestra que no era buena opción para el uso a largo como representación del tiempo y que fue cambiado a la fecha:

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private Date time; 

    private Test() {}; 
} 

Ahora bien, hay dos maneras - ya sea para migrar datos persistentes o para escribir adaptador de XML que se encargará de largo hora y aplicarlo a la fecha y hora.

Si elegimos la segunda manera, sería genial si JAXB API proporciona la versión de clase que se almacenó en xml (suponiendo que no se especifique ninguna clase en clase = 0) y agreguemos nueva versión de clase explícitamente (ya sea anotación o por campo estático):

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
@XmlClassVersion(value = 1) 
public class Test { 

    private Date time; 

    private Test() {}; 
} 

o

@XmlRootElement 
@XmlAccessorType(value = XmlAccessType.FIELD) 
public class Test { 

    private static final long xmlSerialVersionUID = 1; 

    private Date time; 

    private Test() {}; 
} 

y JAXB proporcionará XmlAdapter como sigue:

public abstract class XmlAdapter<ValueType,BoundType> { 
    protected XmlAdapter() {} 
    public abstract BoundType unmarshal(ValueType v, long classVersion) throws Exception; 

    public abstract ValueType marshal(BoundType v, long classVersion) throws Exception; 
} 

Para admitir múltiples versiones, por supuesto, tenemos que implementar dicho adaptador y manejar diferentes versiones explícitamente. Claramente, JAXB agregará información especial sobre la clase en xml y generará xml en la última versión de clase.

NOTA: el punto del ejemplo anterior que tenemos 2 representaciones de clase diferentes en la persistencia simultáneamente pero que aún pueden asignarse a la versión de clase disponible en el tiempo de ejecución.

Respuesta

1

JAXB significa "Arquitectura Java para Enlace XML", por lo tanto, se trata de vincular valores de campos de objetos con elementos/atributos XML, y no de serializar objetos Java. En leer, por ejemplo, este article, verá que dice

javax.xml.se unen, contiene clases e interfaces para realizar operaciones tales como unmarshalling, de clasificación y validación

Java serialización de objetos es otra cosa, y que está relacionado con la serialVersionUID que lo menciona en su pregunta.

+0

Pero si usamos JAX WS como implementación de servicios web - JAXB API = API de serialización. ¿No es correcta esta afirmación? –

+0

Por lo que sé, JAX WS usa 'xjc: serializable' para cubrir el _binding_ de las clases que implementan' java.io.Serializable'. Mire el artículo [JAXB] (http://www.oracle.com/technetwork/articles/javase/index-140168.html) y busque "xjc: serializable". – MarcoS

0

Si está utilizando JAXB persistiría xml y no el objeto java. Si persistiera el objeto java sería serialización. La transformación Jaxb intenta unir los valores xml a los atributos de clase. Mientras los requisitos previos de transformación funcionen, no debería haber un problema. Otras bibliotecas, como JIBX, intentan acceder directamente a bytecode. La versión de clase puede ser un problema en tal caso.

Cuestiones relacionadas