3

ベースにabsractプロパティがあり、2つの派生クラスによってオーバーライドされます。プロパティをそのうちの 1 つに対してシリアル化する必要がありますが、他のプロパティはシリアル化しません。

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

リーフの「IsSelected」プロパティに [DataMember] 属性を配置するだけで十分だと思いましたが、どうやら、リーフのプロパティでさえシリアル化されていないようです。

ありがとう!

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

CompositeクラスとComponentクラスの両方のIsSelectedプロパティにも[DataMember]属性を追加する必要があります。それを試してみてください。

于 2012-09-26T17:35:39.303 に答える