我正在使用DataContractSerializer使用DataMember属性将对象序列化为XML(仅公共属性被序列化) .是否可以动态忽略某些属性,以便它们不会包含在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); }
然而, deserializing 这将是一个痛苦,因为你的清单需要提供给物品;如果您还需要反序列化,则可能需要编写复杂的自定义列表 .
作为第二个想法;只需使用 just 要序列化的项目创建对象的第二个实例;非常简单有效:
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`
AFAIK, DataContractSerializer 不支持成员的条件序列化 .
DataContractSerializer
在 individual property 级别,如果您使用 XmlSerializer ,这是一个选项,但是对于属性,例如 Foo ,您只需添加:
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 */ } }
这些纯粹作为基于名称的约定应用 .
There is ignore data member attribute
2 回答
对于列表方案,可能只是具有不同的属性,因此不是:
你有:
然而, deserializing 这将是一个痛苦,因为你的清单需要提供给物品;如果您还需要反序列化,则可能需要编写复杂的自定义列表 .
作为第二个想法;只需使用 just 要序列化的项目创建对象的第二个实例;非常简单有效:
AFAIK,
DataContractSerializer
不支持成员的条件序列化 .在 individual property 级别,如果您使用
XmlSerializer
,这是一个选项,但是对于属性,例如Foo
,您只需添加:要么:
这些纯粹作为基于名称的约定应用 .
There is ignore data member attribute