2010-08-26 55 views
7

我有一个DataMember属性的基类。我也有一个带有DataMember属性的派生类。在我的WCF项目中,我返回派生类。有没有办法阻止我的基类中的成员序列化?下面是一些示例代码:WCF DataContract从派生类中序列化排除数据成员

public class BaseClass 
{ 
    public string ShortDescription {get;set;} 
    public string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    public List<Description> Descriptions {get;set;} 
} 

在这段代码我希望能够隐藏继承的成员SHORTDESCRIPTION和LongDescription,因为他们现在已经过时。任何尝试这样做都不成功。这是我曾尝试:

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    // override the base class members 
    [IgnoreDataMember]  
    public override string ShortDescription {get;set;} 
    [IgnoreDataMember] 
    public override string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    // shadow the base class members 
    [IgnoreDataMember]  
    public new string ShortDescription {get;set;} 
    [IgnoreDataMember] 
    public new string LongDescription {get;set;} 
} 

这两种方法都不工作过。输出到WSDL时,“DerivedClass”类型仍包含基类类型的“忽略”成员。

你可能想知道为什么我不只是改变基类。这是因为我仍然使用原始形式的基类作为WSDL类型的以前版本,以支持消费者的向后兼容性。以这种方式,我可以有一个返回BaseClass的v1000调用和一个返回DerivedClass的V1010调用。我可以根据需要添加和更改DerivedClass的功能,而不会影响v1000功能的消费者。

回答

2

最终我找到了一个合适的方法来处理这个任务。我没有在我面前的代码,所以我要去说明语法。这是一个非常简单的解决方案,但它解决了我遇到的具体问题。

public class BaseClass 
{ 
    // leave this guy empty 
} 

public class DerivedClassVersion1 : BaseClass 
{ 
    [DataMember] 
    public string ShortDescription {get;set;} 

    [DataMember] 
    public string LongDescription {get;set;} 
} 

public class DerivedClassVersion2 : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 
} 

Badda bing!很简单,但这是我所需要的。

0

试试这个:

public class BaseClass 
{ 
    [DataMember] 
    public virtual string ShortDescription {get;set;} 

    [DataMember] 
    public virtual string LongDescription {get;set;} 
} 

public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 

    public override string ShortDescription {get;set;} 
    public override string LongDescription {get;set;} 
} 

编辑:也许利用消息协定能够精确地控制序列化可以工作:http://msdn.microsoft.com/en-us/library/ms730255.aspx

否则,你也可以考虑实施“WCF路由器”,这将允许您使用相同的端点,但将不同的版本路由到不同的服务。

+1

这产生了相同的结果。有趣的是,如果我执行覆盖并提供[DataMember]属性以试图让它显示在DerivedClass的XML定义中,它仍然不会显示在DerivedClass中,而是显示在基类中。 – omatase 2010-08-26 20:01:16

+0

Hrmmpf ...是的,这不起作用;) – Kwal 2010-08-26 20:26:32

6

尝试向两个类添加[DataContract]属性。这将告诉序列化程序查看[DataMember]和[IgnoreDataMember]属性。如果没有课程被[DataContract]归因,所有公共成员都会被序列化。

[DataContract] 
public class BaseClass 
{ 
    [IgnoreDataMember] 
    public string ShortDescription {get;set;} 

    [IgnoreDataMember] 
    public string LongDescription {get;set;} 
} 

[DataContract] 
public class DerivedClass : BaseClass 
{ 
    [DataMember] 
    public List<Description> Descriptions {get;set;} 
} 

此外,它甚至会更好,通过在指定它的命名空间添加到您的datacontracts [DataContract(命名空间=“...”)]属性。这将打破旧客户呼叫您的更新服务。

+0

值得注意的是,WITH [DataContract]上的类不再需要展开[IgnorDataMember] - 因为只有具有[DataMember]的成员才会包含在传输中。 – Ricibob 2016-09-07 09:20:26

相关问题