我正在使用 DataContractSerializer 使用 DataMember 属性将对象序列化为 XML(仅对公共(public)属性进行序列化)。
是否可以动态忽略某些属性,以便它们不会包含在 XML 输出中?
例如,允许用户在某个列表控件中选择所需的 xml 元素,然后仅序列化用户选择的那些元素,不包括所有未选择的元素。
谢谢
最佳答案
对于列表场景,可能只是有一个不同的属性,所以而不是:
[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
不支持成员的条件序列化。在 个人属性(property) 级别,如果您使用
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 */ }
}
这些纯粹是作为基于名称的约定应用的。
关于.net - 使用 DataContractSerializer 时忽略运行时的某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10528967/