对于列表场景,可能只是有不同的属性,所以不是:
[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 */ }
}
这些仅作为基于名称的约定应用。