gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:44:47 27 4
gpt4 key购买 nike

我有一个带有 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 功能的使用者。

最佳答案

尝试将 [DataContract] 属性添加到这两个类。这将告诉序列化程序查看 [DataMember] 和 [IgnoreDataMember] 属性。如果没有使用 [DataContract] 赋予类,则所有公共(public)成员都将被序列化。

[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=".​​..")] 属性中指定命名空间来为数据契约(Contract)添加命名空间会更好。这会破坏旧客户调用您更新的服务。

关于WCF DataContract 排除 DataMembers 在派生类中被序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com