繁体   English   中英

使用DataContractSerializer序列化overriden属性

[英]Serialize overriden property with DataContractSerializer

我在基数中有一个absract属性,被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;
        }
    }
}

我认为在Leaf的'IsSelected'属性上放置[DataMember]属性是足够的,但显然,甚至Leaf的属性都没有被序列化。

谢谢!

我在Reflector中挖掘了这个,查看了System.Runtime.Serialization的4.0.0.0版本,看起来生成序列化契约的代码显式忽略了从某个基类重写的属性。 因此,运行时明确且故意不在您的示例中序列化Leaf.IsSelected

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

一如既往,我们不应过分依赖Reflector所展示的内容,因为代码总是可以改变,但至少我们知道它是故意这样做的。

如果其他人正在寻找,代码是ImportDataMembers在功能上ClassDataContract.ClassDataContractCriticalHelper

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM