0

我有这个班级模型:

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 不得不重新设计我的类真的很烦人。

任何人都知道如何解决这个问题?

编辑:作为一个额外的问题 - 你如何使用代码/解码 java.util.Map 和 Jibx?我知道它不能在本地完成(很高兴被反驳!)但是你会怎么做 Map 编码(没有字符串)。请注意,我们没有使用 jibx-extras.jar,因此解决方案不应依赖它。

4

1 回答 1

0

实际上,恕我直言,让 C 作为 B 的父级(在 XML 意义上)感觉很正常,因为C 包含 B 的信息(从它继承的)和它自己的信息,但是 B 不知道那些 C 特定的信息对吗?

为了更清楚:它 B 是Bird而 C 是Chicken。鸡是鸟,所以 C 继承了 B,OK。但在 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>

?

所以从模型的角度来看,这对我来说似乎是合乎逻辑的......而且我没有找到在绑定教程中实现相反的方法,抱歉。

于 2009-06-12T22:27:22.133 回答