3

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

[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;
        }
    }
}

我认为将 [DataMember] 属性放在 Leaf 的“IsSelected”属性上就足够了,但显然,连 Leaf 的属性都没有被序列化。

谢谢!

4

2 回答 2

1

我在 Reflector 中对此进行了深入研究,查看了 4.0.0.0 版本System.Runtime.Serialization,似乎生成序列化合同的代码明确忽略了从某些基类覆盖的属性。因此,在您的示例中,运行时明确且故意不序列化Leaf.IsSelected

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

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

如果其他人在看,代码就是ImportDataMembers.ClassDataContract.ClassDataContractCriticalHelper

于 2014-12-24T18:20:12.703 回答
0

您还需要在CompositeComponent类的IsSelected[DataMember]属性上添加该属性。试试看。

于 2012-09-26T17:35:39.303 回答