2010-12-29 2 views
1

JAXB XML 비 직렬화에 대한 표준 접근 방식은 컨텍스트를 생성 할 때 패키지 이름을 지정하는 것입니다. 내가 패키지 이름을 지정하지 않아도 여전히 개체를 역 직렬화 할 수있는보다 유연한 접근 방식을 찾고 있어요JAXB는 XML에 클래스 이름을 저장하여 비 직렬화 코드가 클래스에 대한 지식을 필요로하지 않도록 할 수 있습니까?

JAXBContext jc = JAXBContext.newInstance("com.foo"); 
Unmarshaller u = jc.createUnmarshaller(); 
Object o = u.unmarshal(new StringReader("<?xml version="1.0" encoding="UTF-8"  standalone="yes"?><MyJaxb>...")); 

: 그럼, JAXB는 루트 요소를 기반으로 클래스를 찾습니다. 이것은 JAXB가 XML에 패키지를 저장하는 것처럼 간단하지만이 작업을 수행하는 방법을 찾지 못하는 것 같습니다. 내가 직접 코드를 작성해도 좋지만 불쾌 할 것이다. 가능한 경우 JAXB에 맡기십시오. BTW, 나는 스키마를 사용하지 않고 Annotations와 marshal/unmarshal 만 사용한다. 어떤 아이디어?

답변

1

실제로 "모든"객체는 순수한 JAXB로 deserialize 할 수 없습니다. 당신은 어느 패키지 (ObjectFactory.class을 찾을 것인가) 또는 JAXBContext.newInstance(Class1.class, Class2.class, Class3.class);과 같은 클래스 목록을 지정해야합니다. 이것이 jaxb가 작동하는 방법입니다. 그것은 합의의 일부입니다. 작업이 더 넓은 경우 (예 : 임의의 xml 데이터 구조에서 자바 클래스를 빌드하는 것도 가능합니다. 그러나 좀 더 구체적이어야합니다. "더 유연한 접근"이란 무엇을 의미합니까?

+0

클래스 패스에있는 객체를 역 직렬화 할 수있는 기능이 필요합니다. 예 : Object o = u.unmarshal (...); 모든 가능한 패키지를 지정하지 않고 새 패키지로 클래스를 추가 할 때 목록을 지속적으로 업데이트 할 필요가 없습니다. 필요한 것은 패키지 이름을 XML에 저장하는 것입니다. 나는 GSON이 이것을한다고 생각한다. – Andrew

+0

@Andrew. 비 직렬화하고 무엇을할까요? 그것이 문제였습니다. Java에서는 Object를 사용하여 많은 작업을 수행 할 수 있지만 JS로 전달하면 훨씬 많은 작업을 수행 할 수 있습니다. – Osw

+0

Object (예 : 리플렉션)로 할 수있는 일이 많습니다. 그게 내가 필요한 것입니다. 내 솔루션이 XML에 패키지 이름을 추가하는 것처럼 보입니다. – Andrew

1

jaxbcontext 객체의 인스턴스를 가져올 때 둘 이상의 패키지를 추가 할 수 있어야합니다. 아래에 원하는만큼 패키지를 추가 할 수 있습니다.

JAXBContext jc = JAXBContext.newInstance("com.foo.package1:com.foo.package2"); 

그러나 Object 인스턴스로 deserialize하면 어떻게 사용할 지 모르겠습니다. 역 직렬화 한 것을 사용하지 않습니까?

또한 응용 프로그램이 다중 스레드 스레드 인 경우 Unmarshaller는 스레드 안전 클래스가 아닙니다.

+0

jax-rs를 통해 객체를 수신하고이를 처리하는 방법을 알고있는 서비스로 전달합니다. 여러 패키지를 제공 할 수 있다는 것을 잘 알고 있지만 유지 관리 문제 일 수 있습니다. – Andrew

+0

패키지 이름을 등록 정보 또는 구성 파일에 넣기 만하면됩니다. 위의 내용을 다시 사용하고 새 패키지를 추가해야 할 때마다 컴파일 할 필요가 없도록 config 파일에서 필요한 패키지를 정의 할 수 있습니다. 그게 니가하고 싶은거야? – fmucar

+0

그럴 수 있지만 그때마다 새 클래스를 추가 할 때마다 해당 파일을 업데이트해야합니다. 자동으로 업데이트 된 빌드 스크립트는이를 해결할 수는 있지만 그렇게하고 싶지는 않습니다. JAXB가 더 좋은 해결책을 가지고 있지 않다는 것을 나는 쉽게 상상할 수 없다. – Andrew

관련 문제