Попытка компактно сериализовать объект с помощью Castor - PullRequest
2 голосов
/ 25 февраля 2011

Я использую Castor для записи карты идентификаторов пользователя с временными интервалами.Я использую его для сохранения и возобновления прогресса в длительной задаче и пытаюсь сделать XML максимально компактным.Моя карта состоит из строки userID's в класс, который содержит временные метки интервала, а также дополнительные временные данные, которые мне не нужно сериализовать.

Я могу использовать отображение вложенных классов:

...
<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>

Мне бы хотелось, чтобы имя, начало и конец пользователя находились в одном узле, подобном этому.

Но мне кажется, что я не могу найти его, поэтому атрибуты start и end в значении находятся в том же узле, что и ключ.Любые идеи будут с благодарностью.

Ответы [ 3 ]

1 голос
/ 28 февраля 2011

Нэш, я думаю, устроить раскладку касторов - это немного сложно.Если вы хотите иметь структуру, подобную

<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> 
0 голосов
/ 21 марта 2011

Я отвечаю на свой вопрос здесь, так как есть решение, которое делает именно то, что я хочу, и на самом деле есть ошибка в объяснении в http://www.castor.org/xml-mapping.html#Sample-3:-Using-the-container-attribute - атрибут container является именно тем, чтоздесь нужно.

Изменение одной строки в отображении:

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

сделал точно , что я хотел, он не создал подэлемента для значения, просто отобразилполя в существующий родительский элемент.С тех пор я использовал это довольно много раз, чтобы отобразить классы с несколькими значениями в их родителя.

Ошибка, конечно, заключается в том, что документация утверждает, что вы делаете это, устанавливая атрибут container на ложь .Конечно, это должно быть true .

0 голосов
/ 26 февраля 2011

Я думаю, вы должны использовать location на s и e. Попробуйте это: -

...

<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>
...