2011-02-17 4 views
10

간단한 임베디드 컬렉션을 직렬화하려고합니다. 예를 들어 :SimpleXml 프레임 워크 - 임베디드 컬렉션

Map<String, List<MyClass>> 

나는 이미 내가 @ElementMap과 노력, MyClass에 필요 주석을 추가하지만이 작동하지 않습니다 Exception in thread "main" org.simpleframework.xml.transform.TransformException: Transform of class java.util.ArrayList not supported

그것의 단지

@ElementMap Map<String, MyClass> 

잘 작동하는 경우 . 나는 임베디드 컬렉션을 다룰 줄 모른다. 나는 @ElementList annotation에 대해 알고 있지만이 경우에는 그것을 사용하는 방법을 모른다. 어떤 힌트?

답변

9

저는 같은 문제를 겪고 있습니다. 필자가 관리 할 수있는 유일한 방법은 다른 클래스의 List를 래핑하는 것이 었습니다.

public class MyWrapper { 

    @ElementList(name="data") 
    private List<MyClass> data = new ArrayList<MyClass>(); 

    public MyWrapper(List<MyClass> data) { 
     this.data = data; 
    } 

    public List<MyClass> getData() { 
     return this.data; 
    } 

    public void setData(List<MyClass> data) { 
     this.data = data; 
    } 

} 

그리고, 대신

@ElementMap Map<String,List<MyClass>> 

의 ... 당신이 가진 것 : 내 경우

@ElementMap Map<String,MyWrapper> 

을,지도 (내 클래스 즉, 다른 클래스 전적으로 개인이다 지도에 직접 말하지 마십시오.) 그래서이 여분의 레이어를 가지고 있다는 사실은 많은 차이를 만들지 않습니다. 물론 제작 된 XML은 총체적이지만, 제 경우에는 그것을 소비하는 클래스 외부에 아무것도 없으므로 견디기가 쉽습니다. 내가 이보다 더 나은 해결책을 갖기를 바랍니다. 그러나 그 순간, 나는 혼란 스럽습니다.

+0

답변 해 주셔서 감사합니다. 나는 그것에 대해서도 생각했다 :) 나는 org.simpleframework.xml.convert.Converter interface.but을 구현하는 자신의 변환기를 사용하여 그러한 객체를 직렬화 할 수 있었다. 그러나 나는 두 가지 해결책 모두에 만족하지 않는다. 상자에서 꺼내는 것이 더 쉬운 방법이라고 생각합니다. 우리는 Java 컬렉션을 직렬화하는 것에 대해 이야기하고 있습니다. 로켓 과학이 아닙니다. –

+0

내 의견을 바탕으로 내 자신의 변환기를 시험해 보았습니다. 실제로 두 가지 옵션 중 더 나은 옵션이라고 생각합니다. 적어도 변환기 만 있으면 serializer를 행복하게 만들 수있는 구조로 내 도메인 객체를 오염시키지 않습니다. –