2012-09-26 69 views
3

我在基地有一個absract屬性,被2個派生類覆蓋。我想被序列化的屬性爲其中之一,而不是其他:使用DataContractSerializer序列化覆蓋屬性

[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」屬性就足夠了,但顯然,連葉的屬性序列化。

謝謝!

+0

你爲什麼要應用serializable和datacontract? –

回答

0

您需要添加[DataMember]屬性上複合組件類的IsSelected屬性都爲好。試試看。

+0

但我不希望Composite能夠序列化任何東西! – alhazen

+0

爲什麼你關心Composite.IsSelected是否被序列化? –

1

我在Reflector中挖掘了這一點,查看System.Runtime.Serialization的4.0.0.0版本,看起來生成序列化合約的代碼顯然忽略了某些基類覆蓋的屬性。所以在你的例子中,運行時明確而刻意地不連載Leaf.IsSelected

我懷疑它是這樣做的,因爲他們不想處理檢查基類(或一些中間祖先類)是否也要序列化屬性。如果是這種情況,最終可能會有多個正在序列化的屬性值,這可能是不可取的。

和往常一樣,我們不應該過分依賴Reflector的顯示,因爲代碼總是可以改變的,但至少我們知道它的行爲是有目的的。

如果其他人正在查看,代碼是ClassDataContract.ClassDataContractCriticalHelper中的ImportDataMembers函數。