使用DataContractSerializer时,忽略运行时的某些属性

我正在使用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); }

然而, 反序列化这将是一个痛苦,因为您的列表需要添加到Items中; 如果您也需要反序列化,则可能需要编写一个复杂的自定义列表。


作为第二个想法; 简单地创建只是要序列化的项目对象的第二个实例; 非常简单而有效:

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不支持成员的条件序列化。

单个属性级别,如果您使用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 */ }
}

这些纯粹是作为基于名称的惯例来应用的。


有忽略数据成员属性

链接地址: http://www.djcxy.com/p/59361.html

上一篇: Ignore some properties in runtime when using DataContractSerializer

下一篇: I do not understand this PHP Code, what is it doing?