【问题标题】:What is JAXB and why would I use it? [closed]什么是 JAXB,我为什么要使用它? [关闭]
【发布时间】:2009-03-03 16:34:41
【问题描述】:

这里有人发誓说 JAXB 是自切片面包以来最伟大的东西。我很想知道 Stack Overflow 用户认为 JAXB 的用例是什么,以及是什么使它成为该案例的好或坏解决方案。

【问题讨论】:

标签: java jaxb


【解决方案1】:

我是 JAXB 处理 XML 的忠实粉丝。基本上,它为这个问题提供了一个解决方案(我假设熟悉 XML、Java 数据结构和 XML 模式):

使用 XML 很困难。需要一种方法来获取 XML 文件(基本上是文本文件)并将其转换为某种数据结构,然后您的程序可以对其进行操作。

JAXB 将采用您编写的 XML 模式并创建一组与该模式相对应的类。 JAXB 实用程序将创建用于操作 XML 的数据结构层次结构。

然后可以使用 JAXB 读取 XML 文件,然后创建生成的类的实例 - 加载来自 XML 的数据。 JAXB 也做相反的事情:接受 java 类,并生成相应的 XML。

我喜欢 JAXB,因为它易于使用,并且附带 Java 1.6(如果您使用的是 1.5,则可以下载 JAXB .jars。)它创建类层次结构的方式很直观,并且根据我的经验,确实如此一项体面的工作,抽象出“XML”,以便我可以专注于“数据”。

所以回答您的问题:我希望,对于小型 XML 文件,JAXB 可能是矫枉过正。它要求您创建和维护 XML 模式,并使用将 Java 类用于数据结构的“标准教科书方法”。 (主类、表示“节点”的小内部类以及它们的巨大层次结构。)因此,对于应用程序的“首选项”的简单线性列表来说,JAXB 可能不是那么好。

但是,如果您有一个相当复杂的 XML 模式,并且其中包含大量数据,那么 JAXB 就太棒了。在我的项目中,我在二进制(由 C 程序使用)和 XML(以便人类可以使用和修改这些数据)之间转换大量数据。生成的 XML Schema 很重要(很多层次的层次结构,有些字段可以重复,有些则不能),因此 JAXB 有助于处理它。

【讨论】:

  • JAXB 可以在没有 XSD 的情况下完成。可以使用注解:jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
  • JAXB 是一个规范(如 JPA 或 JAXP),这意味着有多种实现(Metro、EclipseLink 等)。如果你有一个问题,你可以切换到另一个实现。您还可以利用不同供应商提供的扩展程序。
  • @BlaiseDoughan,Metro 是一个 JAXB 实现?! Metro 不是 WSIT 实现吗?
  • @MuhammadGelbana - 我想我应该将其称为 Project JAXB (jaxb.java.net),它是 Metro JAX-WS 实施 (metro.java.net) 的一部分。
  • 仅供参考,JAXB 正在从 Java SE 11 中删除。请参阅 JEP 320: Remove the Java EE and CORBA Modules。此操作是Modularization of Java SE 的一部分,并将@​​987654326@ 技术移交给Jakarta EE 项目。您必须将 JAXB API 和一个实现添加到您的项目中。
【解决方案2】:

不使用它的原因是:性能受到影响。编组和解组时会产生大量开销。您可能还想考虑另一个用于 XML-Object 绑定的 API——例如 JiBX: http://jibx.sourceforge.net/

【讨论】:

  • 如果您在绑定方面遇到问题,还可以考虑使用工具 XSD2Jibx - 它处于“alpha”状态,但它确实有助于说明它喜欢 XSD 模式的类和绑定......现在,如果只是它默认停止使用 SQL 日期,而是使用 Java util Date...
  • 废话。 JAXB 非常快,只要您使用快速解析器(如 Woodstox),与手动绑定相比,开销可能会增加 30-40%。 JiBX 很好,没问题,但性能差异不大。
  • 我已经在几个项目中使用过JAXB,并继续使用它。但重要的是要了解它与其他框架的比较。如果您正在编组/解组数百兆字节的文档,并且时间很重要 - JiBX 是一个不错的选择。 JAXB == 反射,JiBX == 字节码检测。
【解决方案3】:

我一直在工作中使用 JAXB,我真的很喜欢它。它非常适合不断变化的复杂 XML 模式,尤其适用于随机访问 XML 文件中的标签。

我讨厌拉皮条,但我刚开始写博客,这实际上是我发布的第一件事!

在这里查看:

http://arthur.gonigberg.com/2010/04/21/getting-started-with-jaxb/

【讨论】:

  • 博客上的清晰示例。为此点赞。 :-)
【解决方案4】:

这是一个“XML 的 ORM”。最常与 JAX-WS 一起使用(实际上 Sun 的实现是一起开发的),用于 WS Death Star 系统。

【讨论】:

    【解决方案5】:

    使用 JAXB,您可以自动创建对象的 XML 表示(编组)和 XML 的对象表示(解组)。

    就 XML Schema 而言,您有两种选择:

    • 从 XSD 生成 Java 类
    • 从您的 Java 类生成 XSD

    还有一些更简单的 XML 序列化库,例如 XStreamDigesterXMLBeans,它们可能是替代品。

    【讨论】:

    • 这些不是绑定框架,它们是序列化库。一个好的绑定框架可以将任何 XML 映射到同构对象图或再次映射回来。这些简单的序列化机制产生和使用一个固定的、非标准的 XML 模式。
    • 感谢 erickson,我只与 JAXB 合作过,想确保我提到了替代方案。我将根据您的输入编辑我的答案。
    • 其实,虽然 XStream 还可以,但其实并不简单,因为两者都非常简单。而且 Digester 并不简单,只是简单化。
    • 有人请提及使用注释的 JAXB-2.0。在这几个 XmlAdapter 类之间,我可以将任何模式映射到任何现有的 Java 结构。
    【解决方案6】:

    如果您必须对定义为 XML 架构 (xsd) 的某些外部 XML 规范进行编码,那么 JAXB 非常棒。

    例如,您有一个交易应用程序,您必须将交易报告给 Uber Lame Trade Reporting App,他们已经给了您ultra.xsd 以便继续处理。使用$JAVA_HOME/bin/xjc 编译器将XML 转换成一堆Java 类(例如UltraTrade)。

    然后您只需编写一个简单的适配器 层将您的交易对象转换为UltraTrades 并使用JAXB 将数据编组到 Ultra-Corp。 比把你的交易转换成 XML 格式更容易

    当 Ultra-Corp 没有真正遵守他们自己的规范时,一切都崩溃了,他们以 xsd:float 的交易 price 实际上应该表示为 double

    【讨论】:

    • 另请注意,您可以先执行代码:从 bean 开始,如果需要,生成模式。
    【解决方案7】:

    我们为什么需要 JAXB? Web 服务的远程组件(用 Java 编写)使用 XML 作为彼此之间交换消息的手段。 为什么选择 XML? 因为 XML 被认为是在资源有限的网络上交换消息的轻量级选项。 因此,我们经常需要将这些 XML 文档转换为对象,反之亦然。例如:简单的 Java POJO Employee 可用于将 Employee 数据发送到远程组件(也是一个 Java 程序)。

    class Employee{
     String name;
     String dept;
     ....
    }
    

    这个 Pojo 应该被转换成 XML 文档,如下所示:

    <Employee>
      <Name>...</Name>
      <Department>...</Department>
    </Employee>
    

    在远程组件,从 XML 文档返回 Java 对象(Un-Marshall)。

    什么是 JAXB?

    JAXB 是执行 Marshalling 和 UnMarshalling 操作的库或工具。它使您免于这种头痛,就这么简单。

    【讨论】:

      【解决方案8】:

      您也可以查看 JIBX。它也是一个非常好的xml数据绑定器,它也专门用于OTA(开放旅游联盟),并得到AXIS2服务器的支持。如果您正在寻找性能和兼容性,可以查看:

      http://jibx.sourceforge.net/index.html

      【讨论】:

        【解决方案9】:

        JAXB 通过默认编组优化提供改进的性能。 JAXB 定义了一个程序员 API,用于从 XML 文档读取和写入 Java 对象,从而简化了通过 Java 读取和写入 XML。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-08
          • 2017-01-10
          • 2011-02-21
          相关资源
          最近更新 更多