2012-05-10 67 views
7

我正在使用DataContractSerializer將對象序列化爲使用DataMember屬性的XML(僅公共屬性已序列化)。
是否可以動態忽略某些屬性,以便它們不會包含在XML輸出中?

例如,允許用戶在某些列表控件中選擇所需的xml元素,然後僅序列化用戶選擇的那些元素,排除所有未選中的元素。使用DataContractSerializer時忽略運行時的一些屬性

感謝

回答

3

對於列表的情況下,也許只是有不同的特性,所以不是:

[DataMember] 
public List<Whatever> Items {get {...}} 

您有:

public List<Whatever> Items {get {...}} 

[DataMember] 
public List<Whatever> SelectedItems { 
    get { return Items.FindAll(x => x.IsSelected); } 

然而,反序列化這將是一個痛苦,因爲你的名單需要飼料到項目;如果您也需要反序列化,則可能需要編寫一個複雜的自定義列表。


作爲第二個想法;只需用創建對象的第二個實例,只需要您想要序列化的項目;非常簡單而有效:

var dto = new YourType { X = orig.X, Y = orig.Y, ... }; 
foreach(var item in orig.Items) { 
    if(orig.Items.IsSelected) dto.Items.Add(item); 
} 
// now serialize `dto` 

據我所知,DataContractSerializer不支持成員的條件系列化。

個人財產水平,這一種選擇,如果你正在使用XmlSerializer,雖然 - 一個屬性,也就是說,Foo,你只需要添加:

public bool ShouldSerializeFoo() { 
    // return true to serialize, false to ignore 
} 

或:

[XmlIgnore] 
public bool FooSpecified { 
    get { /* return true to serialize, false to ignore */ } 
    set { /* is passed true if found in the content */ } 
} 

這些純粹作爲基於名稱的慣例應用。

+0

謝謝Marc。例如,如果我有一個列表的實例,其中MyClass具有三個屬性X,Y和Z,是否可以僅包含屬性X和Y,並且忽略列表中的每個項目的Z,然後將此列表發送到DataContractSerializer並且串行器將在輸出中僅包含X和Y並忽略Z?我只想排除列表中每個項目的一些屬性。這可能與您在上面指定的某些選項有關嗎? – Joxi

+1

在想要序列化'X'和'Y'而不是'Z'的情況下;如果DCS適用於所有**項目,即通過適當選擇「[DataMember]」或「[IgnoreDataMember]」,則只有DCS可用(據我所知);據我所知,DCS沒有條件序列化 –

相關問題