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을 생성합니다.
참고 : 위의 예제에서 우리는 영속성에서 동시에 두 가지 다른 클래스 표현을 가지고 있지만 런타임에서도 사용할 수있는 클래스 버전에 매핑 할 수 있습니다.
하지만 JAX WS를 웹 서비스 구현으로 사용하는 경우 - JAXB API = Serialization API. 이 진술이 맞습니까? –
필자가 아는 한, JAX WS는'java.io.Serializable'을 구현하는 클래스의 _binding_을 커버하기 위해'xjc : serializable'을 사용합니다. [JAXB] (http://www.oracle.com/technetwork/articles/javase/index-140168.html) 문서를보고 "xjc : serializable"을 검색하십시오. – MarcoS