JAXB Is Doing It Wrong; Try Xembly

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

JAXB是一个有10年历史的Java技术,它允许我们将Java对象转换为XML文档(编组)以及反向操作(解组)。这项技术是基于设置器和访问器的,并且在我看来,它违反了面向对象编程的关键原则,将对象转化为被动数据结构。我建议您使用Xembly来将Java对象编组为XML文档。

这是JAXB编组的工作原理。假设您有一个需要编组为XML文档的Book类。您需要创建访问器并对其进行注释:

然后您创建一个编组器,并请求它将Book类的一个实例转换为XML。

你应该期待输出结果类似于这样:

那么它有什么问题呢?与对象关系映射(ORM)中存在的问题基本相同,这在《ORM是一种冒犯性反模式》中有所解释。JAXB将对象视为一袋数据,提取数据并按照JAXB的方式将其转换为XML。对象对这个过程没有任何控制权。因此,对象不再是对象,而是被动的数据包。

一个理想的方法是以以下方式重新设计我们的类Book

然而,这种方法存在一些问题。首先,存在大量的代码重复。在Java中,构建XML文档是一个相当冗长的过程。如果每个类都需要在其toXML()方法中重新实现它,那么我们将面临代码重复的大问题。

第二个问题是我们不知道我们的XML文档应该以什么样的包装形式进行传递。它可能是一个String,也可能是一个InputStream,或者可能是org.w3c.dom.Document的实例。在每个对象中创建许多toXML()方法肯定会造成灾难。

Xembly提供了一种解决方案。正如我之前提到的,它是用于XML构建和操作的命令式语言。以下是如何通过Xembly来实现我们的Book对象:

现在,为了构建一个XML文档,我们应该在对象之外使用这段代码。

这个 Xembler 类将把 Xembly 指令转换成 XML 文档。

这个解决方案的优点是对象的内部通过 getter 方法不会被暴露出来,对象完全负责 XML 编组过程。此外,这些指令的复杂性可能非常高——远远高于 JAXB 的相对繁琐的注解。

Xembly 是一个开源项目,欢迎在 GitHub 上提交您的问题或更正。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-15 at 06:24

sixnines availability badge   GitHub stars