对象到XML,向后和向前兼容性

时间:2011-03-04 12:15:46

标签: java jaxb compatibility backwards-compatibility

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

我的问题是我必须在某个时候更改Java模型(通过添加,重命名或删除属性),因此,我将拥有无法兼容的已保存的XML,这些XML无法绑定回新的类表单。

要解决这个问题,每次我必须进行更改时,我会在新软件包(以其版本命名)下获取所有类的副本并应用请求的更改。在保存XML时,我保存了它的版本,以便我可以决定JAXB应该扫描哪个包来解组这个XML。

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

2 个答案:

答案 0 :(得分:5)

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

对于这个用例,我更喜欢在可能的情况下使用单个模型。这将要求您为对象模型提供多个映射。 JAXB规范没有提供执行此操作的方法,但可以使用MOXy的外部化元数据扩展来完成:

元数据可用于补充注释,或用于替换注释。因此,我建议使用注释映射基本模式,并使用XML格式修改每个模式版本的元数据。

  

我的问题是我必须这样做   有时候改变Java模型(通过   添加,重命名或删除   因此,我会有   无法比较的无法保存的XML   绑定回新的表格。

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

答案 1 :(得分:1)

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

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