有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Castor XML映射和java。util。地图

在过去的几天里,我一直在使用Castor来尝试以可读的方式在Java程序和XML之间进行一些序列化。尽管Castor有一些缺点,但它通过反射自动生成xml的功能非常强大。不幸的是,有一件事情似乎被完全排除在示例之外,那就是处理泛型。反射API似乎做得很好,但由于它只是因为方法以get___()开头而无意中捕获了大量冗余数据,所以我想编写自己的映射文件来避免这种情况

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

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

任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    对于我的第一个问题,诀窍是不要在field元素中指定类型,而是允许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输出将使用condition1和condition2样式的XML输入Clazz的“condition”字段,同时仍然引用其正确的实例化类型

  2. # 2 楼答案

    关于我的第二个问题:

    当使用映射或表指定某个对象时,需要在field元素中的bind-xml元素中重新定义org.exolab.castor.mapping.MapItem。示例取自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>
    

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