过去几天我一直在使用Castor来尝试以可读的方式在我的Java程序和XML之间进行一些序列化。虽然它有一些故障,但Castor通过反射生成的自动xml实际上非常实用。不幸的是,在例子中似乎完全遗漏的一件事是处理泛型。似乎反射API确实做得很好,但由于方法以get___()
开始无意中抓取了大量冗余数据,我想编写自己的映射文件以避免这种情况。
首先,在“field
”元素的属性中,应该定义“type
”似乎完全公平。但是,如果此类型是抽象类型或仅仅是接口,则不指定应该执行的操作。我应该把什么作为那种类型?
其次,Castor中指定的大多数“集合”类型对象(List
,Vector
,Collection
,Set
等)只需要1个泛型类型,因此指定“ type
“就像里面的内容和”collection="true"
“就足够了。但是,它没有指定在像Map
这样的集合的情况下我应该做什么,其中需要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的“条件”字段,同时仍然引用其正确的实例化类型。