2011-02-25 1 views
2

저는 Castor를 사용하여 사용자 ID 맵을 시간 간격으로 작성합니다. 나는 그것을 저장하고 긴 작업에서 진행을 재개하기 위해 사용하고 있으며 가능한 XML을 작게하려고 노력 중이다. 내 맵은 문자열 userID에서 인터벌 타임 스탬프가 들어있는 클래스와 직렬화 할 필요가없는 추가 임시 데이터를 사용합니다.Castor를 사용하여 오브젝트를 컴팩트하게 직렬화하려고 시도합니다.

... 
<field name="userIntervals" collection="map"> 
<bind-xml name="u"> 
    <class name="org.exolab.castor.mapping.MapItem"> 
    <field name="key" type="string"><bind-xml name="n" node="attribute"/></field> 
    <field name="value" type="my.package.TimeInterval"/> 
    </class> 
</bind-xml> 
</field> 
... 
<class name="my.package.TimeInterval"> 
<map-to xml="ti"/> 
<field name="intervalStart" type="long"><bind-xml name="s" node="attribute"/></field> 
<field name="intervalEnd" type="long"><bind-xml name="e" node="attribute"/></field> 
</class> 
... 

과 같습니다 출력을 얻을 :

내가 중첩 클래스 매핑을 사용할 수있어

내가 원하는 것은 이름입니다

<u n="36164639"><value s="1292750896000" e="1292750896000"/></u> 

을, 시작과 끝 이런 단일 노드의 사용자.

<u n="36164639" s="1292750896000" e="1292750896000"/> 

하지만 시작과 끝은 "값"은 "키"와 같은 노드 이동 속성 때문에 그것을 변통 수없는 것. 어떤 아이디어라도 대단히 감사하겠습니다.

+0

하나의 (약간 결함이있는) 접근은'value'에 대한 커스텀'FieldHandler'를 가지고 있다고 생각했습니다 -하지만 시작과 종료 시간을 하나의 속성에 넣어야합니다. 내가 원하는 것보다 조금 더 작고;) –

답변

0

암, 여기에 내 자신의 질문에 대답.

매핑에 하나 개의 라인 변경 :

<field name="value" type="my.package.TimeInterval" container="true"/> 

나는,이 값에 대한 하위 요소를 작성하지 않은 원하는 것을 정확히않았다, 단지 기존의 부모 요소로 필드를 매핑. 그 이후로 저는 여러 번 값 클래스를 부모 클래스에 매핑하는 데이 작업을 몇 번 사용했습니다.

컨테이너 특성을 거짓으로 설정하여 오류가 발생하는 것은 물론 문서 오류입니다.입니다. 물론 이어야합니다.

0

나는 selocation을 사용할 수 있다고 생각합니다. 이 시도 : -

... 

<class name="my.package.TimeInterval"> 
    <map-to xml="ti"/> 
    <field name="intervalStart" type="long"> 
     <bind-xml name="s" location="u" node="attribute"/> 
    </field> 
    <field name="intervalEnd" type="long"> 
     <bind-xml name="e" location="u" node="attribute"/> 
    </field> 
</class> 
+0

나는 이것을 시험해 보았다. 't' 노드 밑에 다른 자식 노드'u'를 추가했습니다. 아마도'location'이 XPath라고 생각하고 현재 노드를'..'을 사용하여 부모 노드로 되돌릴 수 있고 이상한'<..>' 자식 노드를 만들었을 것입니다 : ( –

1

내쉬, 내가 캐스터 매핑이 조금 까다 롭습니다 주선 생각합니다. 당신이

<u n="36164639" s="1292750896000" e="1292750896000"/> 

같은 구조를 갖고 싶어 그런 다음 당신은 모든 세 개의 필드 키, intervalStart, intervalEnd을 가지고 할 수있는 새로운 POJO 파일을 작성해야합니다. 그리고 파일 이름을 KeyTimeInterval로 지정하십시오. 그리고 아래와 같이 매핑하십시오. 컨테이너 속성이 여기에 필요한 정확히입니다 - 내가 원하는 것을 정확하게 수행하고, 설명에 오류가 http://www.castor.org/xml-mapping.html#Sample-3:-Using-the-container-attribute에서 실제로 거기에 해결책이 있기 때문에

<field name="userIntervals" collection="map">  
    <class name="org.exolab.castor.mapping.MapItem"> 
    <field name="u" type="my.package.KeyTimeInterval"> 
     <bind-xml name="u" node="element"/> 
    </field>    
    </class>   
</field> 



<class name="my.package.KeyTimeInterval"> 
    <field name="key" type="String"> 
     <bind-xml name="n" node="attribute"/></field> 
    <field name="intervalStart" type="long"> 
     <bind-xml name="s" node="attribute"/></field> 
    <field name="intervalEnd" type="long"> 
     <bind-xml name="e" node="attribute"/></field> 
</class> 
+0

그건 바깥 쪽 - 내가 필요로하는 상자.나는 방금지도를 반복하고 pojos (그리고 내가 다시로드했을 때 그 역)의 목록으로 변환했다. 매력처럼 작동합니다. –

관련 문제