Java 域模型随序列化而更改

Java 域模型随序列化而更改,java,xml,serialization,marklogic,Java,Xml,Serialization,Marklogic,我想就如何处理域模型在序列化后发生更改的场景发表一些看法。与in-out项目一样,我们将POJO以XML格式保存在Marklogic数据库中。对我们来说,这是一种恢复商店 但我们可能会在pojo模型中进行一些更改,即字段级别更改的层次结构更改。所以如果我想从我们的数据库中恢复。它会坏的 那么,我该如何处理这种情况呢?MarkLogic本质上是一个无模式的NoSQL存储,这意味着试图在其上强制一个模式,并期望它永远不会改变(像一个具体的POJO模型)将挫败这一想法。如果您希望保持灵活性并允许随着时

我想就如何处理域模型在序列化后发生更改的场景发表一些看法。与in-out项目一样,我们将POJO以XML格式保存在Marklogic数据库中。对我们来说,这是一种恢复商店

但我们可能会在pojo模型中进行一些更改,即字段级别更改的层次结构更改。所以如果我想从我们的数据库中恢复。它会坏的


那么,我该如何处理这种情况呢?

MarkLogic本质上是一个无模式的NoSQL存储,这意味着试图在其上强制一个模式,并期望它永远不会改变(像一个具体的POJO模型)将挫败这一想法。如果您希望保持灵活性并允许随着时间的推移进行模式修改,我可以提出以下建议:

  • 对于已知将保持模式一致的文档,仍然可以序列化/反序列化POJO
  • 您可以检索结构未知的xml文档,并使用解析器遍历它们,或者使用来检索所需的数据
  • 我的首选解决方案是:直接连接到MarkLogic XQuery API(使用XQJ或类似工具)并直接阅读文档。更多信息

  • MarkLogic本质上是一个无模式的NoSQL存储,这意味着试图在其上强制一个模式,并期望它永远不会改变(就像一个具体的POJO模型)将挫败这一想法。如果您希望保持灵活性并允许随着时间的推移进行模式修改,我可以提出以下建议:

  • 对于已知将保持模式一致的文档,仍然可以序列化/反序列化POJO
  • 您可以检索结构未知的xml文档,并使用解析器遍历它们,或者使用来检索所需的数据
  • 我的首选解决方案是:直接连接到MarkLogic XQuery API(使用XQJ或类似工具)并直接阅读文档。更多信息

  • 看待问题的一种方式是,它完全是一个应用程序/Java级别的问题。假设不涉及数据库,应用程序打算如何管理两个数据模型的共存? “DTO”或对象/对象映射是处理此问题的一种方法。例如,使用库,如-您可以定义POJO版本之间的映射,并在运行时转换它们。这就解决了问题,但却忽略了MarkLogic不仅仅是一个简单的POJO存储的潜力

    另一种看待这一点的方式,类似于Johns的答案,就是以您描述的方式使用MarkLogic(只是作为序列化POJO的一种方式)并没有有效地利用其功能。MarkLogic集应用服务器和数据库于一体。通过使用少量服务器端代码,您可以实现一个稳定的界面,该界面可以支持各种格式,并随着应用程序的发展而发展。这还允许您将处理“卸载”到服务器上,这通常可以实现显著的性能改进。服务器中存储的数据格式不需要以任何方式与应用程序发送或接收的格式相似

    当您在应用层执行需要多个“对象”的操作时,尤其如此——如果您使用传统的RDB ORM(对象关系映射)使用MarkLogic建模,并对POJO进行1:1映射,以记录您错过了在服务器上组合和重构操作的机会,并且经常需要发出许多请求来执行一次即可完成的操作。不仅存在多个请求的开销,而且ML中的许多操作在不受限于必须存储与应用程序对象按1:1建模的DB对象时,效率显著提高


    如果将接口移动到应用程序中的ML上层或更高层,则可以在服务器上而不是客户端上执行业务逻辑,而不是在服务器上存储最低级别的POJO,而是实现“服务”模型。这通常会显著提高性能,减少代码大小。

    看待问题的一种方式是,这完全是一个应用程序/Java级别的问题。假设不涉及数据库,应用程序打算如何管理两个数据模型的共存? “DTO”或对象/对象映射是处理此问题的一种方法。例如,使用库,如-您可以定义POJO版本之间的映射,并在运行时转换它们。这就解决了问题,但却忽略了MarkLogic不仅仅是一个简单的POJO存储的潜力

    另一种看待这一点的方式,类似于Johns的答案,就是以您描述的方式使用MarkLogic(只是作为序列化POJO的一种方式)并没有有效地利用其功能。MarkLogic集应用服务器和数据库于一体。通过使用少量服务器端代码,您可以实现一个稳定的界面,该界面可以支持各种格式,并随着应用程序的发展而发展。这还允许您将处理“卸载”到服务器上,这通常可以实现显著的性能改进。服务器中存储的数据格式不需要以任何方式与应用程序发送或接收的格式相似

    当您在应用层执行需要多个“对象”的操作时,尤其如此——如果您使用传统的RDB ORM(对象关系映射)使用MarkLogic建模,并对POJO进行1:1映射,以记录您错过了在服务器上组合和重构操作的机会,并且经常需要发出许多请求来执行一次即可完成的操作。不仅存在多个请求的开销,而且ML中的许多操作在不受限于必须存储与应用程序对象按1:1建模的DB对象时,效率显著提高

    如果将接口移动到应用程序中的ML上层或更高层,则可以在服务器上而不是客户端上执行业务逻辑,而不是在服务器上存储最低级别的POJO,而是执行