C# 确保动态加载类型的向后兼容性

C# 确保动态加载类型的向后兼容性,c#,backwards-compatibility,C#,Backwards Compatibility,我有一个动态加载的类型。变量部分从数据库中的xml字段中读取。例如 class SomeClass { public int Id {get; set;} public string Name {get; set;} public string Url {get; set;} } 名称和url部分是通过读取 <element> <name>Name</name> <type>string</type>

我有一个动态加载的类型。变量部分从数据库中的xml字段中读取。例如

class SomeClass 
{
   public int Id {get; set;}
   public string Name {get; set;}
   public string Url {get; set;}
}
名称和url部分是通过读取

<element>
    <name>Name</name>
    <type>string</type>
</element>
<element>
    <name>Url</name>
    <type>string</type>
</element>


名称
一串
网址
字符串
回退URL
一串
如何保持向后兼容性?这意味着如果我以后在类上进行扩展,我如何确保在较旧版本的dbs上部署较新版本时(有时可能是这样)不会崩溃

阅读:

特别是(摘要):

考虑对XML模式进行更改的两种情况:

案例1。新模式改变了某些元素的解释。例如,对于以前的模式有效且有意义的构造不会针对新模式进行验证

案例2。新模式扩展了名称空间(例如,通过添加新元素),但不会使以前有效的文档无效

标识新架构版本的一些选项是:

  • 更改(内部)架构版本属性
  • 在根元素上创建schemaVersion属性
  • 更改架构的targetNamespace
  • 更改架构的名称/位置
  • XML架构版本控制最佳实践

    [1] 捕获XML模式中某个位置的模式版本

    [2] 在实例文档中标识实例与之兼容的架构的版本

    [3] 使XML架构的早期版本可用

    [4] 当一个XML模式只被扩展时(例如,新元素、属性、枚举列表的扩展等等),人们应该努力不使现有的实例文档失效

    [5] 其中,新模式改变了某些元素(例如,构造)的解释 对于前一个架构来说,这是有效且有意义的
    新架构),您应该更改目标命名空间。

    您能更清楚地了解您所关心的场景吗?我对DTO等的版本控制非常熟悉,但您的意图并不清楚。只是为了确保向后兼容性——这意味着如果包含扩展类型的版本部署在较旧的数据库上,它不会崩溃,并且只对较小的子集或属性起作用。您是否反序列化Xml?或者只是读取Xml并赋值?为了获得最佳结果和控制,请查看MSDN上的IXmlSerializable。@IAbstract OP询问的是另一件事,他想知道如何在不破坏旧代码的情况下进行序列化。@Elena使用旧版本dbs XML文件或数据库是什么意思?
    class SomeClass 
    {
       public int Id {get; set;}
       public string Name {get; set;}
       public string Url {get; set;}
       public string FallbackUrl {get; set;}
    }
    
    <element>
        <name>Name</name>
        <type>string</type>
    </element>
    <element>
        <name>Url</name>
    <    type>string</type>
    </element>
    <element>
        <name>FallbackUrl</name>
        <type>string</type>
    </element>