我正在使用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"/>
但是我似乎无法使用它,因此“值”中的起始和结束属性与“键”位于同一节点中。任何想法都将不胜感激。
答案 0 :(得分:1)
纳什 我认为安排脚轮映射有点棘手。 如果你想拥有像
这样的结构<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>
答案 1 :(得分:0)
我认为您应该能够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>
答案 2 :(得分:0)
我在这里回答了我自己的问题,因为有一个解决方案可以完全符合我的要求,并且在http://www.castor.org/xml-mapping.html#Sample-3:-Using-the-container-attribute的解释中实际上存在错误 - 容器属性正是如此需要在这里。
更改映射中的一行:
<field name="value" type="my.package.TimeInterval" container="true"/>
完全完全我想要的东西,它没有为值创建子元素,只是将字段映射到现有的父元素。从那时起,我已经使用了很多次来将多值类映射到它们的父类中。
错误当然是文档说明您通过将容器属性设置为 false 来执行此操作。当然,它应该是 true 。