我有一个这样的课程:
[Serializable]
public class Structure
{
#region Constants and Fields
/// <summary>
/// The description.
/// </summary>
private string description;
#endregion
/// <summary>
/// Gets or sets the Description of the subclass i.e subtype of structure
/// </summary>
public string Description
{
get
{
return this.description;
}
set
{
this.description = value;
}
}
}
下面的另一个类继承了上面的一个:
[XmlRoot(Namespace = "TestNamespace", ElementName = "OrgStructure")]
public class OrgStructure : Structure
{
private long orgDeptID;
/// <summary>
/// The description
/// </summary>
private string description;
public long OrgDeptID
{
get
{
return this.orgDeptID;
}
set
{
this.orgDeptID= value;
}
}
}
我正在将ASMX服务迁移到WCF,以使它们与现有的ASMX客户端兼容。所以我必须使用XmlSerializer
代替DataContractSerializer
。
OrgStructure
的响应类型中MessageBodyMember
被声明为OperationContract
。
ASMX客户端不期望XML消息中的Description
。所以我尝试隐藏(使用new
运算符)派生类中的Description
属性并将XmlIgnoreAttribute
应用于它。但它仍然序列化这个属性。
(请注意description
变量的声明。我不知道为什么开发人员再次声明派生类而不是将它protected
保留在基类本身。)
在使用XmlSerializer时,如何忽略派生类中基类的属性?我不能在基类中忽略它,因为Structure
的其他子类型需要它。
答案 0 :(得分:3)
在基类中添加:
public virtual bool ShouldSerializeDescription() { return true; }
和派生类,添加:
public override bool ShouldSerializeDescription() { return false; }
这是XmlSerializer
识别的模式,但必须在与成员(Description
)相同的级别声明,因此需要将其virtual
。
如果它冒犯了眼睛,请添加一些:
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
到它 - 但必须 public
才能正常工作。