什么是JAXB,我为什么要使用它?

Jay*_* R. 104 java jaxb

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

pou*_*def 96

我是操作XML的JAXB的忠实粉丝.基本上,它提供了解决此问题的方法(我假设您熟悉XML,Java数据结构和XML模式):

使用XML很困难.人们需要一种方法来获取XML文件 - 基本上是一个文本文件 - 并将其转换为某种数据结构,然后程序可以操作.

JAXB将采用您编写的XML Schema并创建一组与该模式对应的类.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的情况下完成.您可以使用注释:https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html (21认同)
  • JAXB是一个规范(如JPA或JAXP),这意味着有多个实现(Metro,EclipseLink等).如果您遇到问题,可以切换到另一个实现.您还可以利用不同供应商提供的扩展. (7认同)
  • 仅供参考,从Java SE 11中删除了JAXB。请参见[* JEP 320:删除Java EE和CORBA模块*](http://openjdk.java.net/jeps/320)。此操作是[Java SE模块化](https://en.wikipedia.org/wiki/Java_Platform_Module_System)和[Java EE](https://en.wikipedia.org/ Wiki / Java_Platform,_Enterprise_Edition)技术应用于[* Jakarta EE *](https://jakarta.ee)项目。您将必须在项目中添加JAXB API和实现。 (2认同)

cod*_*ger 23

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

  • 我在几个项目中使用过JAXB,并继续使用它.但了解它与其他框架的比较非常重要.如果您正在编组/解组数百兆字节的文档,并且时间很重要 - JiBX是一个不错的选择.JAXB ==反射,JiBX ==字节代码检测. (6认同)
  • 废话.JAXB非常快,只要您使用快速解析器(如Woodstox),与手动绑定相比,开销可能高达30-40%.JiBX很好,没问题,但性能差异不大. (3认同)

Tom*_*ine 19

它是"XML的ORM".最常用于WS Death Star系统的JAX-WS(实际上Sun实现是一起开发的).


art*_*gon 19

我一直在工作中使用JAXB,我真的很喜欢它.它非常适合复杂的XML模式,这些模式总是在变化,尤其适用于XML文件中标记的随机访问.

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

看看这里:

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

  • 您博客上的清晰示例.为此投了赞成票.:-) (4认同)

Fab*_*eeg 9

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

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

  • 从XSD生成Java类
  • 从Java类生成XSD

还有一些更简单的XML序列化库,如XStream,DigesterXMLBeans,可能是替代品.

  • 有人请使用Annotations提及JAXB-2.0.在几个XmlAdapter类之间,我可以将任何模式映射到任何现有的Java结构. (2认同)

oxb*_*kes 8

如果必须编写一些定义为XML模式(xsd)的外部XML规范,JAXB就很棒.

例如,您有一个交易应用程序,您必须向Uber Lame交易报告应用程序报告交易,他们已经让您ultra.xsd继续使用.使用$JAVA_HOME/bin/xjc编译器将XML转换为一堆Java类(例如UltraTrade).

然后你可以编写一个简单的适配器层来转换你的交易对象,UltraTrades并使用它JAXB来整理数据到Ultra-Corp.很多比搞乱转换您的交易到他们的XML格式更容易.

一切都崩溃的地方是Ultra-Corp实际上没有遵守他们自己的规范,而price他们作为a 的交易xsd:float实际上应该表达为double!


Pra*_*t_M 6

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

class Employee{
 String name;
 String dept;
 ....
}
Run Code Online (Sandbox Code Playgroud)

这个Pojo应该转换(Marshall)到XML文档中,如下所示:

<Employee>
  <Name>...</Name>
  <Department>...</Department>
</Employee>
Run Code Online (Sandbox Code Playgroud)

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

什么是JAXB?

JAXB是执行编组和UnMarshalling操作的库或工具.它让你免于这种头痛,就这么简单.