2011-02-25 5 views
2

私はCastorを使用してユーザーIDのマップを時間間隔に書き出しています。私はそれを使って長いタスクで進捗状況を保存し、再開します。できるだけコンパクトなXMLを作成しようとしています。私のマップは、文字列のユーザーIDから、インターバルタイムスタンプを含むクラス、およびシリアル化する必要のない追加の一時的なデータです。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"/> 

しかし、私は、「値」、「キー」と同じノードに行くにとても開始と終了の属性を、それをfinagleように見えることはできません。どんなアイデアでも大歓迎です。

+0

私が考えていた(少し傷ついた)アプローチは、 'value'のカスタム' FieldHandler'を持っていたと考えました - しかし、私は開始属性と終了時間を一つの属性に入れなければなりません。私が望むより少しコンパクトです;) –

答えて

0

アム、ここで自分の質問に答えます。マッピング内の1行を変更

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

は、私が何を望むか正確をしましたが、それは価値のためのサブ要素を作成していない、単に既存の親要素にフィールドをマッピングされました。それ以来、私は多値クラスをその親クラスにマッピングするのにこれをかなり使ってきました。

もちろんの誤差は、ドキュメントは、あなたがコンテナ属性を設定することによって、これを行うと述べています。もちろん、それはでなければなりません。

0

locationseに使用できると思います。これを試してください: -

... 

<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"/> 

のような構造を持ちたいなら、あなたはそれが 3つのフィールドすべてのキー、intervalStart、intervalEndを持つことになる新しいPOJOファイルを作成する必要があります。 そしてFileTimeを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のリストに変換しました(そしてリロードしたときの逆もあります)。魅力のように動作します。 –

関連する問題