For the list scenario, maybe just have a different property, so instead of:
[DataMember]
public List<Whatever> Items {get {...}}
you have:
public List<Whatever> Items {get {...}}
[DataMember]
public List<Whatever> SelectedItems {
get { return Items.FindAll(x => x.IsSelected); }
however, deserializing that would be a pain, as your list would need to feed into Items; if you need to deserialize too, you might need to write a complex custom list.
As a second idea; simply create a second instance of the object with just the items you want to serialize; very simple and effective:
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
does not support conditional serialization of members.
At the individual property level, this is an option if you are using XmlSerializer
, though - for a property, say, Foo
, you just add:
public bool ShouldSerializeFoo() {
// return true to serialize, false to ignore
}
or:
[XmlIgnore]
public bool FooSpecified {
get { /* return true to serialize, false to ignore */ }
set { /* is passed true if found in the content */ }
}
These are applied purely as a name-based convention.