【问题标题】:Castor XML Mapping and java.util.MapCastor XML 映射和 java.util.Map
【发布时间】:2011-03-13 00:21:06
【问题描述】:

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

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: java xml binding castor


    【解决方案1】:

    关于我的第二个问题:

    使用 Map 或 Table 指定某些内容时,您需要在 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 属性。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 2014-08-04
        • 2017-07-02
        相关资源
        最近更新 更多