【问题标题】:Change location of a type in knowntypes with Backward compatibility使用向后兼容性更改已知类型中类型的位置
【发布时间】:2014-05-20 06:11:22
【问题描述】:

我想更改一个类型的程序集,但仍然向后兼容该类型位于不同程序集中的旧客户端

我以前的已知类型是

<add type="Messages.GetImageRoutingRulesResponseMessage, Feeder.Data">
      <knownType type="Rules.DicomPushRule, Feeder.Logic" />
</add>

我将 DicomPushRule 的位置更改为 Feeder.Data ,所以我的新 knowntypes 将如下所示:

<add type="Messages.GetImageRoutingRulesResponseMessage, Feeder.Data">
          <knownType type="Rules.DicomPushRule, Feeder.Data" />
</add>

这会向后兼容吗?

【问题讨论】:

    标签: c# wcf datacontractserializer datacontract


    【解决方案1】:

    这取决于您的合同。

    让我们考虑两个选项:

    1. 你有两个相同的类,但在不同的命名空间中:

      数据合约:

      namespace Feeder.Contract
      {
          [DataContract]
          public class DividendBase
          {
              [DataMember]
              public DateTime AnnouncementDate { get; set; }
          }
      }
      
      namespace Feeder.Logic
      {
          [DataContract]
          public class Dividend : DividendBase
          {
              [DataMember]
              public float Amount { get; set; }
              [DataMember]
              public DateTime ExDate { get; set; }
          }
      }
      
      namespace Feeder.Data
      {
          [DataContract]
          public class Dividend : DividendBase
          {
              [DataMember]
              public float Amount { get; set; }
              [DataMember]
              public DateTime ExDate { get; set; }
          }
      }
      

      在这种情况下,类是不兼容的,因为它们有不同的命名空间,并且在 xml 中看起来也不同。

      在 xml 中序列化:

      <DividendBase i:type="a:Dividend"
                    xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
                    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:a="http://schemas.datacontract.org/2004/07/Feeder.Logic">
        <AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
        <a:Amount>1.2</a:Amount>
        <a:ExDate>2014-05-20T12:21:42.3608838+03:00</a:ExDate>
      </DividendBase>
      
      <DividendBase i:type="a:Dividend" 
                    xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract" 
                    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:a="http://schemas.datacontract.org/2004/07/Feeder.Data">
        <AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
        <a:Amount>1.2</a:Amount>
        <a:ExDate>2014-05-20T12:23:21.2888838+03:00</a:ExDate>
      </DividendBase>
      
    2. 但是如果你为这两个类应用 NameSpace 属性,它们将是兼容的。

      数据契约 属性中带有 NameSpace

      namespace Feeder.Contract
      {
          [DataContract]
          public class DividendBase
          {
              [DataMember]
              public DateTime AnnouncementDate { get; set; }
          }
      }
      
      namespace Feeder.Logic
      {
          [DataContract(Namespace = "Feeder.Contracts")]
          public class Dividend : DividendBase
          {
              [DataMember]
              public float Amount { get; set; }
              [DataMember]
              public DateTime ExDate { get; set; }
          }
      }
      
      namespace Feeder.Data
      {
          [DataContract(Namespace = "Feeder.Contracts")]
          public class Dividend : DividendBase
          {
              [DataMember]
              public float Amount { get; set; }
              [DataMember]
              public DateTime ExDate { get; set; }
          }
      }
      

      两者的XML

      <DividendBase i:type="a:Dividend" 
                    xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
                    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:a="Feeder.Contracts">
        <AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
        <a:Amount>1.2</a:Amount>
        <a:ExDate>2014-05-20T12:25:54.7178838+03:00</a:ExDate>
      </DividendBase>
      
      <DividendBase i:type="a:Dividend"
                    xmlns="http://schemas.datacontract.org/2004/07/Feeder.Contract"
                    xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:a="Feeder.Contracts">
        <AnnouncementDate>0001-01-01T00:00:00</AnnouncementDate>
        <a:Amount>1.2</a:Amount>
        <a:ExDate>2014-05-20T12:26:41.1278838+03:00</a:ExDate>
      </DividendBase>
      

      如您所见,xml 是相同的,因此类是兼容的。

    如果你有第一个变体,那么恐怕你有不兼容的类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 2022-11-11
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多