2012-03-28 2 views
5

JAXB에서 다른 버전의 클래스에 대한 지원이 있는지 궁금합니다. 그것에 대한 나의 생각 : xml 클래스의 일종의 지속 개체 (serialize 된 값) 있지만 클래스 개체 개발 (예 : 기능 확장)로 변경할 수 있습니다. 어떤 버전의 클래스가 JAXB API 만 사용하여 지속성 (XML : 읽기)에 저장되어 있는지 알 수있는 방법이 있습니까?JAXB 및 다른 버전의 클래스

저에게는 표준 Java 직렬화 메커니즘 (serialVersionUID를 의미)에서와 같이 클래스 버전을 저장하는 것이 편리하고 다른 버전의 경우에도 클래스에 XML을 매핑하는 기능을 제공합니다 (예 : 버전에 대한 XmlAdapter 정보 추가). 클래스에 저장 됨). 기본적으로 xml 및 런타임에서 클래스의 버전이 다른 경우 InvalidClassException을 throw합니다.

예 : 그 시간을 가정

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

    private Long time; 

    private Test() {}; 
} 

밀리에서 UNIX의 시간을 다음과 같이 우리는 클래스 테스트가 있습니다.

이 코드는 제작 단계에서 출시되었으며이 클래스는 데이터베이스에 xml로 유지됩니다. 중 하나를 마이그레이션 할 데이터를 지속 또는 긴 처리 할 XML 어댑터를 작성 -

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

    private Date time; 

    private Test() {}; 
} 

지금 두 가지 방법이 있습니다 : 다음 릴리스는 시간 표현으로 오래 사용할 수있는 좋은 선택이 아니었고이 날짜로 변경되었음을 보여줍니다 시간을 적용하여 날짜 시간에 적용하십시오.

두 번째 방법을 선택하면 JAXB API가 xml에 저장된 클래스 버전 (클래스 버전이 0 버전 인 클래스 버전이 지정되지 않은 경우)을 제공하고 클래스의 새 버전을 명시 적으로 추가하면 정적 필드별로 또는 주석)

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

    private Date time; 

    private Test() {}; 
} 

또는

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

    private static final long xmlSerialVersionUID = 1; 

    private Date time; 

    private Test() {}; 
} 

다음과 같이 JAXB는 (때문에) XmlAdapter을 제공한다 :

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; 
} 

여러 버전을 지원하려면 이러한 어댑터를 구현하고 다른 버전을 명시 적으로 처리해야합니다. 분명히, JAXB는 xml에 클래스에 대한 특별한 정보를 추가하고 최신 클래스 버전에 xml을 생성합니다.

참고 : 위의 예제에서 우리는 영속성에서 동시에 두 가지 다른 클래스 표현을 가지고 있지만 런타임에서도 사용할 수있는 클래스 버전에 매핑 할 수 있습니다.

답변

1

JAXB는 "XML Architecture for XML Binding"의 약자이므로 객체 값을 XML 요소/속성에 바인딩하고 Java 객체를 직렬화하지는 않습니다. 예를 들어 article을 읽으면

javax.xml이 표시됩니다.바인딩은

자바 객체 직렬화가 다른 일이 같은 비 정렬 화, 정렬 화 및 검증으로 작업을 수행하기위한 클래스와 인터페이스를 포함, 그것은 당신이 당신의 질문에 언급 serialVersionUID에 관련이.

+0

하지만 JAX WS를 웹 서비스 구현으로 사용하는 경우 - JAXB API = Serialization API. 이 진술이 맞습니까? –

+0

필자가 아는 한, JAX WS는'java.io.Serializable'을 구현하는 클래스의 _binding_을 커버하기 위해'xjc : serializable'을 사용합니다. [JAXB] (http://www.oracle.com/technetwork/articles/javase/index-140168.html) 문서를보고 "xjc : serializable"을 검색하십시오. – MarcoS

0

JAXB를 사용하는 경우 Java 객체가 아닌 xml을 유지하게됩니다. 당신이 자바 객체를 지속한다면 그것은 직렬화 일 것이다. Jaxb 변환은 xml 값을 클래스 속성에 바인딩하려고합니다. 변환 전제 조건이 작동하는 한 문제가 있어서는 안됩니다. JIBX와 같은 다른 라이브러리는 바이트 코드에 직접 액세스하려고합니다. 이 경우 클래스 버전이 문제가 될 수 있습니다.