4

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

field首先,在“ ”元素的属性中,应该定义“ ” ,这似乎是完全公平的type。但是,它没有指定如果这种类型是抽象的或只是一个接口应该做什么。那我应该把什么作为类型呢?

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

任何帮助将不胜感激!

4

2 回答 2

2

对于我的第二个问题:

使用 Map 或 Table 指定某些内容时,您需要在元素内org.exolab.castor.mapping.MapItembind-xml元素内重新定义field。取自此处的示例

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

此外,省略typefield元素的属性。

于 2010-07-07T20:01:09.490 回答
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 的 into XML 输出将在 Clazz 的“条件”字段中使用条件 1 和条件 2 样式的 XML,同时仍然引用其正确的实例化类型。

于 2010-07-08T23:45:48.130 回答