Jibx: интегрировать вывод базового класса в выход расширяющего класса - PullRequest
0 голосов
/ 17 мая 2009

У меня есть модель этого класса:

abstract class A {
    int a;
}

class B extends A {
    int b;
}

class C extends B {
    int c;
}

И я хотел бы получить jibx для вывода этого XML:

<B b=1 a=0>
    <children>
        <C c=2 b=1 a=0/>        
    </children>
</B>

У меня есть эта привязка xml:

<binding>
    <mapping class="A" abstract="true">
        <value name="a" field="a" style="attribute" usage="optional"/>      
        <collection field="children" type="java.util.ArrayList"/>
    </mapping>
    <mapping name="B" class="B" extends="A">
        <value name="b" field="b" style="attribute" usage="optional"/>
        <structure map-as="A"/>
    </mapping>
    <mapping name="C" class="C" extends="B">
        <value name="c" field="c" style="attribute" usage="optional"/>
        <structure map-as="B"/>
    </mapping>
</binding>

Однако я продолжаю получать такие артефакты:

<C c=2>
    <B b=1 a=0>
        <children>
            ...
        </children>
    </B>
</C>

В качестве временного решения я изменил свою структуру наследования, чтобы AbstractB и B расширяли AbstractB, а C расширяли AbstractB, но меня действительно раздражает необходимость перепроектировать мой класс из-за jibx.

Кто-нибудь знает, как это решить?

Edit: В качестве дополнительного вопроса - как вы используете код / ​​декодирование java.util.Map с Jibx? Я знаю, что это не может быть сделано изначально (был бы рад опровергнуть!), Но что бы вы сделали, чтобы закодировать Map (без строк). Обратите внимание, что мы не используем jibx-extras.jar, поэтому решения не должны полагаться на него.

1 Ответ

0 голосов
/ 13 июня 2009

На самом деле, ИМХО, это нормально для получения C как родителя (в XML-смысле) B, потому что C содержит информацию B (от которой он наследует) и свою собственную информацию , но Б не знает об этой специфической для С информации, верно?

Чтобы было понятнее: B - Bird , а C - Цыпленок . Цыпленок - Птица, поэтому C наследует форму B, хорошо. Но в формате XML будет хранить:

<Bird color="brown">
    <Chicken label="Kentucky-fried" />
</Bird>

или

<Chicken label="Kentucky-fried"> <!-- chicken-specific information -->
    <Bird color="brown" /> <!-- "birdy" part of the chicken -->
</Chicken>

Так что с модельной точки зрения мне кажется логичным ... И я не нашел способа добиться обратного в учебнике по связыванию , извините.

...