Posts Tagged ‘jaxb’

让JAXB生成序列化的类

November 20th, 2009

默认jaxb生成的类是没有序列化的,但是我们经常需要他们序列化。jaxb ri有生成序列化的类的这样的功能,但由于这不属于标准的功能,所以需要手动的开启。开启的方法是在用来生成java类的xml schema文件头添加如下内容:

<annotation>
    <appinfo>
        <jaxb:globalBindings generateIsSetMethod="true">
            <xjc:serializable uid="1"/>
        </jaxb:globalBindings>
    </appinfo>
</annotation>

另外,在使用jaxb的 xjc 编译器时,要加上 -extension 的参数。

  • Share/Bookmark

JAXB中如何利用继承生成XML

November 14th, 2009

问题

JAXB是我用过的java处理XML的方法中做方便的一个,在jaxb中如何使用类的集成关系有一个小小的需要注意的地方。看下面的两端XML。
XML 示例1:

<a>
    <b></b>
    <c></c>
<a>

XML示例2:

<a>
    <b></b>
    <d></d>
<a>

这两段XML的唯一差别就在c元素与d元素。为了生成这两个XML,有几种方案。

方案一

不利用类的继承来重用代码,写两套Java代码, 如:

@XmlRootElement(name = a)
public class A {
    B b;
    C c:
}

@XmlRootElement(name = a)
public class A2 {
    B b;
    D d:
}

public class B {}
public class D {}

这一方案不是我们想要的,虽然可以解决问题,但是不能重用两个XML中共有的结构。

方案二

利用一个父类表示两个XML之间的共同的结构,用两个子类扩展这个父类,分别添加 C 和 D 元素。
代码如下:

@XmlRootElement(name = "a")
public class A {
    B b;
}

public class B {}
public class C {}
public class D {}


public class E extends A {
    C c;
}

public class F extends A {
    D d;
}

这一方案看似很直观,但是实践中却发现 E 和 F 却都只能生成 父类的 部分,如下的XML:

<a>
    <b></b>
<a>

即使把 @XmlRootElement(name = “a”) 移到 E 和 F类上也行不通。

方案三

用一个类代表共同的结构,用一个父类代表C和D元素,在用两个类代表具体化的C和D类,如:

@XmlRootEelemnt(name = "a")
public class A {
    B b;

    @XmlElements({
        @XmlElement(name = "c", type=C.class),
        @XmlElement(name = "d", type=D.class)
    })
    E e;
}
public class B {}
public class E {}

public class C extends E {}
public class D extends E {}

这样做才最终达到目的。关键点就是@XmlElements的使用。

  • Share/Bookmark