如果我理解你的想法是正确的,你想使用 XML 模式作为你数据交换的主要模型 - 用于 XML 以及 JSON 格式。
这个想法有两个部分:
- 使用单一来源对所有数据交换进行建模。
- 使用 XML Schema 作为这个单一来源。
单源模型
第一个想法将您带到 MDD (Model-Driven Development) 或 MDA (Model-Driven Architecture),它们在 2002-2005 年左右大肆宣传。这是大量 UML、供应商驱动的炒作,但有不少合理的东西(如 AndroMDA)幸存下来。
一般来说,MDA 是个好主意。只要你做“标准”的事情,它就可以很好地工作。但如果您想“自定义”,那可能是一场噩梦。
在您的情况下,我肯定会说单源模型是有道理的。这是关于数据交换的。在核心中,这可以简化为非常简单的模型,这些模型仍然足够强大,可以表达您需要的一切。
JSON 就是一个例子。 JSON 比 XML 更简单,但仍然足够强大。它清楚地表明,只要你有基本的原始类型、对象、数组和嵌套,你几乎可以表达任何东西。
这种“单一源模型”不一定是 UML,它可以是任何强大到足以涵盖所有底层需求的东西。
“单一来源模型”的主要问题是定制。你知道,90% 的 OOTB 效果很好,但是在 10% 中你没有得到你想要的结果,必须定制,然后努力得到你。大多数生成工具都有一些“插件”。因此,如果您符合 90% 的要求,那么您很幸运,否则您可能需要了解生成工具的复杂内部结构。
总而言之,单源模型是个好主意,只要它满足所有需求,并且为所需场景调整/应用它的努力并不比从头开始制作更大.
XML Schema 作为模型
下一个问题是 XML Schema 是否适合作为单一来源模型。
您可能听说过或使用过JAXB,它有一个schema compiler (XJC)。此编译器可以获取您的 XML 模式,然后生成带有 JAXB 注释的 Java 类。然后可以使用这些类将 XML 解组为 Java 对象或将这些对象编组为 XML。
到 JSON:
JAXB Mapping to JSON
看起来你也可以从这些类中生成 JSON Schema(虽然我自己还没有尝试过):
How to generate JSON schema from a JAXB annotated class?
所以 XML Schema-first 方法有效。你可以称之为schema-driven development(我在此声明这个词的版权)。
我个人做了很多事情——首先为 XJC 写了一些工具/插件。例如:
我的经验是,您可以先做很多事情,但我也不得不说 XML Schema 很好,但不是最好或最简单的模型。该规范很复杂,如果您查看模式派生类,那么您会发现一些不太适合 Java bean 和属性的构造。例如,@XmlElementRef 是一个复杂且通常看起来很奇怪的构造——它仍然是涵盖许多可以在 XML 模式中轻松表达的情况所必需的。在我编写的所有工具中,我总是不得不与此类构造的案例、corder case 和corner case 作斗争。
XML Schema,如果你保持简单和整洁,可能会很漂亮。映射完美的 bean 和属性,易于理解和使用,大量的工具支持。所以XML Schema 并不是建模或指定数据交换的最差选择。
但它也可能变得非常复杂。我看到了很多过度设计的模式,它们非常难以使用 - 收获很少。有时模式设计者只是不太了解 XML 模式,有时却太了解它了。上次我帮助制定“XML Schema 设计最佳实践”时,我们找到了 60 多页的“注意事项”文档。所以很容易弄错 XML Schemas。
但是,正如我上面所说,如果它保持简单和干净,它可能会很漂亮。
有什么选择?
好吧,您实际上可以使用 Java 代码作为模型源。带注释的 POJO 在表达上足够强大且用途广泛,但使用起来仍然非常简单。您不是模式优先,而是 Java 代码优先,但您仍然可以执行所有相同的技巧。您可以 generate an XML Schema 根据您的注释类。您可以使用MOXy 进行持久性(以及更多)。你可以做 JSON just as well.
总结并回答您的问题:
- 是的,它很实用,而且效果很好。
- 除了架构优先的方法,还可以考虑 Java 优先的方法。
- 您拥有获取 XML-Objects-JSON-Persistence 的工具。
- 存在缺陷(见上文)。
希望这会有所帮助。