我有一个带有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功能的消费者。
答案 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路由器”,它允许您使用相同的端点,但将不同的版本路由到不同的服务。