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

oma*_*ase 7 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;}
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我希望能够隐藏继承的成员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;}
}
Run Code Online (Sandbox Code Playgroud)

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;}
}
Run Code Online (Sandbox Code Playgroud)

这些方法都没有奏效.输出到WSDL时的"DerivedClass"类型仍包含基类类型的"Ignored"成员.

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

joe*_*and 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;}
}
Run Code Online (Sandbox Code Playgroud)

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


oma*_*ase 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;}
}
Run Code Online (Sandbox Code Playgroud)

巴达宾!很简单,但这正是我所需要的。