簡體   English   中英

嘗試使用Castor緊湊地序列化對象

[英]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> 

我認為您應該可以在se上使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM