[英]Trying to serialize an object compactly using Castor
我正在使用Castor寫出用戶ID到時間間隔的映射。 我正在使用它來保存和恢復冗長的任務中的進度,並且正在嘗試使XML盡可能緊湊。 我的地圖是從字符串userID到包含時間間隔時間戳以及不需要序列化的其他臨時數據的類的。
我可以使用嵌套的類映射:
...
<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"/>
但是我似乎無法完成它,因此“值”中的開始和結束屬性與“鍵”位於同一節點中。 任何想法將不勝感激。
納什,我認為安排腳輪貼圖有些棘手。 如果你想擁有這樣的結構
<u n="36164639" s="1292750896000" e="1292750896000"/>
然后,您需要創建一個新的pojo文件,它將在其中包含所有三個字段Key,intervalStart,intervalEnd。 並將文件名設置為KeyTimeInterval,然后像下面那樣映射它。
<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>
我認為您應該可以在s
和e
上使用location
。 嘗試這個:-
...
<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>
我在這里回答我自己的問題,因為有一種解決方案可以完全滿足我的要求,並且http://www.castor.org/xml-mapping.html#Sample-3:-使用中的說明中實際上存在錯誤: -the-container-attribute- 容器屬性正是這里所需要的。
更改映射中的一行:
<field name="value" type="my.package.TimeInterval" container="true"/>
完全符合我的要求,它沒有為值創建子元素,只是將字段映射到現有的父元素中。 從那時起,我已經多次使用它來將多值類映射到其父級。
當然,錯誤是文檔說明您通過將container屬性設置為false來執行此操作。 當然,這應該是真的 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.