使用向后兼容性更改已知类型的类型的位置

时间:2014-05-20 06:11:23

标签: c# wcf datacontractserializer datacontract

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

我的旧知名类型是

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

我将DicomPushRule的位置更改为Feeder.Data,因此我的新知识类型将如下所示:

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

这会向后兼容吗?

1 个答案:

答案 0 :(得分:2)

这取决于你的合同。

让我们考虑两个选择:

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

    <强> DataContract:

    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 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是相同的,因此类是兼容的。

  3. 如果您有第一个变种,那么,我担心,您的课程不兼容。