我有一个带有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功能的消费者.
尝试将[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 ="...")]属性中指定名称空间来为数据交换添加名称空间会更好.这会打破旧客户呼叫您更新的服务.
最终我找到了一个合适的方法来处理这个任务。我面前没有代码,所以我将修改语法。这是一个非常简单的解决方案,但它解决了我遇到的具体问题。
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)
巴达宾!很简单,但这正是我所需要的。
| 归档时间: |
|
| 查看次数: |
12741 次 |
| 最近记录: |