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