C# 使用DataContractSerializer序列化重写的属性

C# 使用DataContractSerializer序列化重写的属性,c#,.net,inheritance,datacontractserializer,composite,C#,.net,Inheritance,Datacontractserializer,Composite,我在基中有一个abstract属性,它被两个派生类覆盖。我希望为其中一个而不是另一个序列化属性: [Serializable] [DataContract(IsReference = true)] public abstract class Component { public abstract bool IsSelected { get; set; } } [Serializable] [DataContract] public class Leaf : Component {

我在基中有一个abstract属性,它被两个派生类覆盖。我希望为其中一个而不是另一个序列化属性:

[Serializable]
[DataContract(IsReference = true)]
public abstract class Component
{
    public abstract bool IsSelected { get; set; }   
}

[Serializable]
[DataContract]
public class Leaf : Component
{
    [DataMember]
    public override bool IsSelected { get; set; }   // serialized
}

[Serializable]
[DataContract]
public class Composite : Component
{
    private List<Component> componentList = new List<Component>();

    /// <summary>
    /// Should *not* be serialized
    /// </summary>
    public override bool IsSelected
    {
        get
        {
            foreach (Component component in componentList)
            {
                if (!component.IsSelected)
                    return false;
            }

            return true;
        }
        set
        {
            foreach (Component component in componentList)
                component.IsSelected = value;
        }
    }
}
[可序列化]
[DataContract(IsReference=true)]
公共抽象类组件
{
公共抽象布尔值{get;set;}
}
[可序列化]
[数据合同]
公共类叶:组件
{
[数据成员]
public override bool IsSelected{get;set;}//序列化
}
[可序列化]
[数据合同]
公共类复合:组件
{
私有列表组件列表=新列表();
/// 
///是否应*不*序列化
/// 
公众压倒布尔当选
{
得到
{
foreach(组件列表中的组件)
{
如果(!component.IsSelected)
返回false;
}
返回true;
}
设置
{
foreach(组件列表中的组件)
component.IsSelected=值;
}
}
}
我认为将[DataMember]属性放在Leaf的'IsSelected'属性上就足够了,但显然,甚至连Leaf的属性都没有序列化


谢谢

您还需要在组合组件类的IsSelected属性上添加
[DataMember]
属性。试试看。

我在Reflector中深入研究了这一点,查看了4.0.0.0版本的
System.Runtime.Serialization
,似乎生成序列化协定的代码明确忽略了从某个基类重写的属性。因此,在您的示例中,运行时是显式地故意不序列化
Leaf.IsSelected

我怀疑这样做是因为他们不想检查基类(或某些中间祖先类)是否也要序列化属性。如果是这种情况,您可能最终会序列化属性的多个值,这可能是不需要的

和往常一样,我们不应该过分依赖Reflector显示的内容,因为代码总是可以更改的,但至少我们知道它是故意这样做的


如果其他人正在查看,代码是
ClassDataContract.ClassDataContractCriticalHelper
中的
ImportDataMembers
函数。为什么要同时应用serializable和datacontract?但我不希望该组合序列化任何内容!为什么您关心Composite.IsSelected是否序列化?