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

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

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

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

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

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

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

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

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

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

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

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