处理XML变更的好方法

时间:2010-02-08 19:29:49

标签: c# sql xml linq

我们的系统将XML字符串存储在数据库中。我最近不得不更改一个类的属性,现在当一个XML字符串被反序列化时,它将抛出一个异常。处理这种变化的最佳方法是什么?使用XPATH或LINQ在应用程序代码中查找Node,或者更改sql数据库中的xml字符串(即进行批量更新)?

3 个答案:

答案 0 :(得分:1)

您可能希望编写自定义XML反序列化程序(即实现IXmlSerializable,请参阅here)来处理XML中的更改。如果您已经投入大量时间来制作XML序列化属性,那么您可能需要考虑另一种方法。

考虑批量升级XML,或者在类中弃用(而不是删除)属性,并将旧行为映射到更新的行为。

从长远来看,您将希望在将来提出一个处理此问题的策略,因为在添加/更改系统功能时,您很可能会继续对架构/对象定义进行更改。

答案 1 :(得分:0)

如果将对象序列化到数据库,您可以尝试使用我概述的方法here将旧版本加载到新版本中,然后在保存新版本时保存。不确定是否有适合您班级的不同版本......

基本上,您创建一个工厂来从xml生成对象。每次更改对象时,都会创建一个新工厂和一个新对象类,在其构造函数中为旧类提供一个版本,并从旧类创建。新工厂尝试从xml创建一个新对象,如果它可以,快乐的日子,如果它不能然后它创建一个新对象并告诉下一个最古老的工厂从xml创建一个下一个最旧的对象。然后可以将这些工厂链接在一起,以便始终可以从数据库中的任何数据加载最新版本的对象。

这假设可以始终从v1对象创建有效的v2对象。

答案 2 :(得分:0)

在XML字符串中存储版本是一种很好的做法。在数据库级别或类级别,以便您的代码知道它必须反序列化的类的哪个版本。

您也可以查看XSLT。它允许您将一个版本的XML转换为另一个版本。 在这种情况下,从一个版本到另一个版本的逻辑不是由代码处理,而是由XSLT处理。您甚至可以将XSLT存储到数据库中,使其可以被其他程序重用。