2015-02-01 1 views
1

XML (Java) 용 Simple 프레임 워크를 처음 접하고 특정 클래스 구성을 직렬화하는 문제가 발생했습니다.확장하지 않고 ID로 필드 참조

@Root(name="static") 
class StaticData { 
    @Attribute 
    private String id; 
    @Attribute 
    private String value; 
... 
} 

@Root(name="listdata") 
class ListData { 
    // Problem field 
    @Attribute 
    private StaticData ref; 
    @Element 
    private String name; 
} 

그리고 " TransformException를 :를 지원하지 않는 클래스 StaticData의 변환"가 나타납니다

나는 두 개의 클래스가 있습니다. ListData의 ref-field를 정적 데이터 XML 구조로 확장하지 말고 (@Element는 괜찮을 것입니다.) 참조를 얻으려고합니다.

여기서 "foo"는 이미 내 응용 프로그램에로드 된 일부 StaticData 객체의 "id"에 유효한 값입니다.

는 JAXB에서 나는 XmlJavaTypeAdapter와 주석

@XmlAttribute(name="id") 
@XmlJavaTypeAdapter(MyStaticDataAdapter.class) 

을 사용하지만 간단한에서 작업 동등한를 찾을 수 없습니다.

답변

0

이 동작을 구현하려면 변환기을 사용할 수 있습니다.

@Root(name = "listdata") 
@Convert(ListData.ListDataConverter.class) 
class ListData 
{ 
    @Attribute 
    private StaticData ref; 
    @Element 
    private String name; 

    // ... 

    // Converter implementation 
    static class ListDataConverter implements Converter<ListData> 
    { 

     @Override 
     public ListData read(InputNode node) throws Exception 
     { 
      /* 
      * In case you also want to read, implement this too ... 
      */ 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 

     @Override 
     public void write(OutputNode node, ListData value) throws Exception 
     { 
      node.setAttribute("ref", value.ref.getId()); 
      node.getChild("name").setValue(value.name); 
     } 
    } 
} 

사용법 :

Serializer ser = new Persister(new AnnotationStrategy()); 
          /* ^----- important! -----^ */ 

ListData ld = ... 
ser.write(ld, System.out); // Serialize to std out 

출력이 ListData

...

다음

은 예입니다 0
  • 이름 = ABCDEFG
  • 심판 = ...
    • ID = 123
    • 값은 =이 값을입니다

당신이 얻을거야 ...

<listdata ref="123"> 
    <name>def</name> 
</listdata> 
+0

감사합니다. 그게 정확히 내가 찾고 있던 것이 었습니다. 나는 내 자신의 변환기로 이미 시도했지만 ListData 대신 StaticData를 구현하려고 시도했다. 실패했다. – taranion

+0

단점. ListData에서 Converter를 사용하는 두 가지 옵션이 있습니다 - 전체 클래스에 대해 전역 적으로 또는 단일 필드에 대해서만. 전체 클래스에 적용하면 일반적으로 좋은 결과를 얻을 수있는 * ALL * 다른 필드도 처리해야합니다. 기본 동작이없는 것 같습니다. 단일 필드로 사용하면 동일한 오류가 발생합니다. – taranion

+0

필드에 변환기를 사용하는 경우에는 변환기에'@ Element'를 적용해야합니다. 예 : '@Element @Convert (WhatEver.클래스) '. 하지만 부모 Xml 노드에 액세스 할 수 있는지 확실하지 않습니다. – ollo