Castor XML Mapping和java.util.Map

时间:2010-07-07 19:48:17

标签: java xml binding castor

过去几天我一直在使用Castor来尝试以可读的方式在我的Java程序和XML之间进行一些序列化。虽然它有一些故障,但Castor通过反射生成的自动xml实际上非常实用。不幸的是,在例子中似乎完全遗漏的一件事是处理泛型。似乎反射API确实做得很好,但由于方法以get___()开始无意中抓取了大量冗余数据,我想编写自己的映射文件以避免这种情况。

首先,在“field”元素的属性中,应该定义“type”似乎完全公平。但是,如果此类型是抽象类型或仅仅是接口,则不指定应该执行的操作。我应该把什么作为那种类型?

其次,Castor中指定的大多数“集合”类型对象(ListVectorCollectionSet等)只需要1个泛型类型,因此指定“ type“就像里面的内容和”collection="true"“就足够了。但是,它没有指定在像Map这样的集合的情况下我应该做什么,其中需要2种类型。如何指定键类型和值类型?

任何帮助都将非常感谢!

2 个答案:

答案 0 :(得分:2)

对于我的第二个问题:

使用地图或表格指定内容时,您需要在org.exolab.castor.mapping.MapItem元素中的bind-xml元素中重新定义field。取自here

的示例
<class name="some.example.Clazz">
  <field name="a-map" get-method="getAMap" set-method="setAMap">
    <bind-xml ...>
       <class name="org.exolab.castor.mapping.MapItem">
          <field name="key" type="java.lang.String">
            <bind-xml name="id"/>
          </field>
          <field name="value" type="com.acme.Foo"/>
       </class>
    </bind-xml>
  </field>
</class>

另外,省略父type元素的field属性。

答案 1 :(得分:1)

对于我的第一个问题,诀窍是不在字段元素中指定类型,并允许Castor自己推断它。如果您有可以在那里出现的类的定义,那么它将自动使用它们。例如:

<class name="some.example.Clazz">
    <!-- can contain condition1 or condition2 elements -->
    <field name="condition" collection="arraylist" required="true">
        <bind-xml name="condition" node="element" />
    </field>
</class>  

<class name="some.example.condition1">
    <field name="oneField" >
        <xml-bind name="fieldOne" />
    </field>
</class>

<class name="some.example.condition2">
    <field name="anotherField />
        <xml-bind name="fieldTwo" />
    </field>
</class>

Castor对XML的输出将使用condition1和condition2样式的XML进入Clazz的“条件”字段,同时仍然引用其正确的实例化类型。