Кастор XML Mapping и java.util.Map - PullRequest
3 голосов
/ 07 июля 2010

В последние пару дней я использовал Castor , чтобы попытаться сделать сериализацию между моей Java-программой и XML понятной.Хотя в Castor есть несколько недостатков, автоматическая генерация xml с помощью отражения на самом деле очень функциональна.К сожалению, одна вещь, которая, кажется, довольно хорошо исключена из примеров, касается дженериков.Кажется, что API отражения делает замечательную работу в том виде, в каком он есть, но поскольку он непреднамеренно захватывает много избыточных данных только потому, что методы начинаются с get___(), я хотел написать свой собственный файл отображения, чтобы предотвратить это.

Во-первых, совершенно справедливо, что в атрибутах элемента "field" нужно определить "type".Однако в нем не указано, что следует делать, если этот тип является абстрактным или просто интерфейсом.Что же тогда следует указывать в качестве типа?

Во-вторых, большинству объектов типа «коллекция», указанных в Castor (List, Vector, Collection, Set и т. Д.), Требуется только 1 универсальный типпоэтому достаточно указать "type" как внутри и "collection="true"".Тем не менее, он не определяет, что я должен делать в случае коллекции, такой как Map, где необходимо 2 типа.Как я могу указать тип ключа и тип значения?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 08 июля 2010

На второй мой вопрос:

При указании чего-либо с помощью карты или таблицы необходимо переопределить org.exolab.castor.mapping.MapItem в элементе bind-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>

Кроме того, пропустите атрибут type из родительского элемента field.

1 голос
/ 09 июля 2010

Для моего первого вопроса, хитрость заключается в том, чтобы НЕ указывать тип в элементе поля и позволить 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 в XML будут использованы XML-условия condition1 и condition2 в поле Clazz «условие», в то же время ссылаясь на соответствующий тип экземпляра.

...