什么是JAXB,为什么要使用它?[关闭]


109

这里有人发誓说JAXB是切面包以来最伟大的事情。我很好奇看到Stack Overflow用户认为用例适用于JAXB,以及使该用例成为好方案还是不好的解决方案。


2
阅读本文(XML绑定的Java体系结构(JAXB)),这是最好的。URL:oracle.com/technetwork/articles/javase/index-140168.html#unmars

Answers:


99

我是操纵XML的JAXB的忠实拥护者。基本上,它提供了解决此问题的方法(我假设熟悉XML,Java数据结构和XML Schema):

使用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有助于操纵它。


21
无需XSD即可完成JAXB。您可以使用注释:jaxb.dev.java.net/guide/Mapping_your_favorite_class.html
codefinger

7
JAXB是一个规范(例如JPA或JAXP),意味着有多种实现(Metro,EclipseLink等)。如果您遇到问题,可以切换到另一种实现。您还可以利用其他供应商提供的扩展。
bdoughan

@ BlaiseDoughan,Metro是JAXB实现吗?Metro不是WSIT实施吗?
Muhammad Gelbana

1
@MuhammadGelbana-我想我应该将其称为Project JAXB(jaxb.java.net),它是Metro JAX-WS实现(metro.java.net)的一部分。
bdoughan

2
仅供参考,正在从Java SE 11中删除JAXB。请参见JEP 320:删除Java EE和CORBA模块。该动作是Java SE模块化以及Java EE技术移交给Jakarta EE项目的一部分。您将必须在项目中添加JAXB API和实现。
罗勒·布尔克

23

这是不使用它的原因:性能会下降。编组和拆组时有很多开销。您可能还需要考虑另一个用于XML对象绑定的API,例如JiBX:http : //jibx.sourceforge.net/


1
如果您在绑定时遇到麻烦,也可以考虑使用工具XSD2Jibx-它处于“ alpha”状态,但是说明在XSD模式下喜欢的类和绑定确实很有帮助...现在,如果默认情况下仅停止使用SQL date ,而改用Java util Date ...
MetroidFan2002,2009年

3
废话。只要使用快速解析器(如Woodstox),JAXB就会非常快,与手动绑定相比,开销可能约为30-40%。JiBX很好,没有问题,但是性能差异并不大。
StaxMan

6
我在几个项目上使用过JAXB,并继续使用它。但是了解与其他框架的比较很重要。如果要封送/解封数百兆的文档,并且时间很重要-JiBX是一个不错的选择。JAXB ==反射,JiBX ==字节码检测。
codefinger

19

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



9

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

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

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

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


1
这些不是绑定框架,而是序列化库。一个好的绑定框架可以将任何XML映射到同构对象图或再次映射。这些简单的序列化机制产生并使用固定的非标准XML模式。
erickson

谢谢erickson,我只使用JAXB,并想确保我提到其他方法。我将根据您的输入来编辑答案。
Fabian Steeg,2009年

实际上,虽然XStream还可以,但实际上并没有那么简单,因为两者都很简单。Digester并不简单,只是简单化。
StaxMan

2
有人请使用批注提及JAXB-2.0。在这几个XmlAdapter类之间,我可以将任何模式映射到任何现有的Java结构。
Mark Renouf

8

如果您必须对定义为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实际上没有遵守他们自己的规范,而price他们下跌的交易xsd:float实际上应该表示为double


1
还要注意,您可以先执行代码:从bean开始,在需要时生成模式。
StaxMan

7

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

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

应该将该Pojo转换(Marshall)为XML文档,如下所示:

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

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

什么是JAXB?

JAXB是执行编组和反编组操作的库或工具。如此简单,它使您免于头痛。



0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.