我正在使用DataContractSerializer將對象序列化爲使用DataMember屬性的XML(僅公共屬性已序列化)。
是否可以動態忽略某些屬性,以便它們不會包含在XML輸出中?
例如,允許用戶在某些列表控件中選擇所需的xml元素,然後僅序列化用戶選擇的那些元素,排除所有未選中的元素。使用DataContractSerializer時忽略運行時的一些屬性
感謝
我正在使用DataContractSerializer將對象序列化爲使用DataMember屬性的XML(僅公共屬性已序列化)。
是否可以動態忽略某些屬性,以便它們不會包含在XML輸出中?
例如,允許用戶在某些列表控件中選擇所需的xml元素,然後僅序列化用戶選擇的那些元素,排除所有未選中的元素。使用DataContractSerializer時忽略運行時的一些屬性
感謝
對於列表的情況下,也許只是有不同的特性,所以不是:
[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 */ }
}
這些純粹作爲基於名稱的慣例應用。
謝謝Marc。例如,如果我有一個列表的實例,其中MyClass具有三個屬性X,Y和Z,是否可以僅包含屬性X和Y,並且忽略列表中的每個項目的Z,然後將此列表發送到DataContractSerializer並且串行器將在輸出中僅包含X和Y並忽略Z?我只想排除列表中每個項目的一些屬性。這可能與您在上面指定的某些選項有關嗎? –
Joxi
在想要序列化'X'和'Y'而不是'Z'的情況下;如果DCS適用於所有**項目,即通過適當選擇「[DataMember]」或「[IgnoreDataMember]」,則只有DCS可用(據我所知);據我所知,DCS沒有條件序列化 –