2012-05-10 2 views
7

Я использую DataContractSerializer для сериализации объекта в XML с использованием атрибута DataMember (только публичные свойства сериализуются).
Можно ли динамически игнорировать некоторые свойства, чтобы они не включались в вывод XML?

Например, чтобы разрешить пользователю выбирать желаемые элементы xml в каком-либо элементе управления списком, а затем сериализовать только те элементы, которые выбраны пользователем, за исключением всех, которые не выбраны.Игнорировать некоторые свойства во время выполнения при использовании DataContractSerializer

Благодаря

ответ

3

Для сценария списка, возможно, просто имеют разные свойства, поэтому вместо того, чтобы:

[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` 

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 */ } 
} 

Они применяются исключительно как соглашение, основанное на названиях.

+0

Thanks, Marc. Например, если у меня есть экземпляр List , где MyClass имеет три свойства X, Y и Z, можно ли включить только свойства X и Y и игнорировать Z для каждого элемента в списке, а затем отправить этот список в DataContractSerializer и сериализатор будет включать только X и Y на выходе и игнорировать Z? Я просто хочу исключить некоторые свойства для каждого элемента в списке. Возможно ли это с некоторыми параметрами, указанными выше? – Joxi

+1

В случае необходимости сериализации 'X' и' Y', но не 'Z'; с DCS, который доступен только (насколько я знаю), если он применим к ** всем ** элементам, то есть путем выбора '[DataMember]' или '[IgnoreDataMember]' соответственно; DCS не имеет условной сериализации, насколько мне известно. –

Смежные вопросы