WCF DataContract排除DataMembers在派生类中被序列化

时间:2010-08-26 16:06:59

标签: wcf

我有一个带有DataMember属性的基类。我还有一个带有DataMember属性的派生类。在我的WCF项目中,我将返回派生类。有没有办法阻止我的基类中的成员序列化?以下是一些示例代码:

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”类型仍包含基类类型的“Ignored”成员。

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

3 个答案:

答案 0 :(得分: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;}
}

此外,通过在[DataContract(Namespace =“...”)]属性中指定名称空间来为数据交换添加名称空间会更好。这会打破旧客户调用您更新的服务。

答案 1 :(得分: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!很简单,但这就是我需要的。

答案 2 :(得分: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路由器”,它允许您使用相同的端点,但将不同的版本路由到不同的服务。