【问题标题】:Object to XML, backward and forward compatibility对象到 XML,向后和向前兼容性
【发布时间】:2011-07-08 18:59:29
【问题描述】:

我正在一个应用程序中工作,我们需要以 XML 格式保存对象,并在需要时加载它们。为此,我使用 JAXB 将 XML 编组和解组回 Java 类。

我的问题是有时我必须更改 Java 模型(通过添加、重命名或删除属性),结果,我将保存不兼容的 XML,无法绑定回新的类表单。

为了解决这个问题,每次我必须进行更改时,我都会复制一个新包(以其版本命名)下的所有类并应用请求的更改。在保存 XML 时,我会保存它的版本,这样我就可以决定 JAXB 应该扫描哪个包来解组这个 XML。

我的问题是,有没有其他方法可以使用 JAXB 实现向后和向前兼容性?如果没有,还有其他技术可以支持吗?

【问题讨论】:

  • 我担心模型结构将来可能会发生变化,而我现在看到的唯一使用旧版本的方法就是保留旧类,这看起来不太好也不实用.你能建议处理这种情况的最佳方法是什么吗?我需要以 XML 格式保存对象并能够再次加载它...

标签: java jaxb compatibility backwards-compatibility


【解决方案1】:

注意:我是 JAXB 2 (JSR-222) 专家组的成员和领导 EclipseLink JAXB (MOXy)

对于这个用例,我更喜欢尽可能使用单个模型。这将要求您有多个对象模型的映射。 JAXB 规范没有提供这样做的方法,但可以使用 MOXy 的外部化元数据扩展来完成:

元数据可以用来补充注释,也可以用来替换它们。因此,我建议您使用注释映射您的基本架构,并使用 XML 格式来修改每个架构版本的元数据。

我的问题是我必须 有时更改 Java 模型(通过 添加、重命名或删除 attributes) ,因此,我将拥有 无法保存的不兼容的 XML 绑定回新的类表单。

删除 Java 属性(字段/属性)会使事情变得困难,因为旧的 XML 将无法映射到任何内容。相反,您可以将它们留在模型中,并在 XML 元数据文件中将它们标记为“@XmlTransient”。

【讨论】:

  • 感谢 Blaise,我正在尝试应用您的建议,但我想知道 MoXy 是否可以提供类似的内容:A 类 { @Override @XmlElements({ @XmlElement(name = "B1", type = B1.class), @XmlElement(name = "B2", type = B2.class) }) List 列表; } 接口 B{} 类 B1 实现 B {} 类 B2 实现 B {} 以支持接口类型列表???
  • 鉴于答案已经很老了,这仍然是解决问题的最佳方法吗?
【解决方案2】:

如果您只添加新属性,它仍然可以工作:它被称为“鸭子打字”。您的对象是免费的,它会忽略它没有的额外内容。

如果您修改或删除所需的属性,您只需要担心版本控制。不幸的是,数据库模式、Java 序列化和任何其他持久性技术就是这种情况。 XML 不是魔法。它不是免疫的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2023-04-03
    • 2011-02-06
    • 1970-01-01
    • 2018-09-11
    相关资源
    最近更新 更多