`
cpop
  • 浏览: 9164 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用JAXB 将java继承的类序列化xml

    博客分类:
  • java
 
阅读更多
JAXB是将java实体类序列化和反序列化处理中比较方便的一个工具,在jaxb的使用中,若是实体类中存在继承的层次关系,那么就需要一些值得注意的地方了。
比如在开发百度轻应用时候就需要处理到:
<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
    <loc>http://www.baidu.com/</loc>
    <lastmod>2010-01-01</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
    <data>
        <display>
            <!-- display 标签内的字段为微站在标准 sitemap 协议基础上的扩展,
                描述微站所需的标签内容
            -->
        </display>
    </data>
</url>
</urlset>


可以看到此xml中,display节点下是根据各个模板的不同,而不同的,那么在java的开发实体构建中,我们是可以定义几个子类的,然后让它们来继承这个display类。则所有的模板格式就可以通过JAXB来生成了。
简化的格式如下:
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;
}

这个方案看着比较直观也符合一般逻辑思想,但是问题在于实践中只能生成父类部分,结果如下:
<a>
    <b></b>
<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 {}

这样的结构,最后就能正确生成了。
ps:类结构可以使用这个工具生成,http://xml2csharp.com/(我本是c#程序员,因为工作上的需要,所以在独自的学习java)
那么在实际的开发过程中,序列化成xml可能会碰到很多特殊的一些问题,但是自己去看并理解那些报错信息,对于我们问题的解决是有帮助的,灵活运用上面的那些xml标记,那么才能体现到JAXB的好用。
<完>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics