как сериализовать атрибут в каком-то состоянии - PullRequest
7 голосов
/ 08 декабря 2010

При использовании XML-сериализации для сериализации класса, как сделать так, чтобы какой-либо атрибут выводился условно. т.е. в некоторых случаях он выводит этот атрибут, в других - нет.

Ответы [ 4 ]

13 голосов
/ 08 декабря 2010

Вы можете создать дополнительное свойство с именем MyPropertySpecified, которое возвращает логическое значение.
Когда это свойство возвращает true, свойство MyProperty будет сериализовано. Когда он возвращает false, он не будет сериализован.

Кроме того, вы хотите декорировать это свойство с помощью XmlIgnoreAttribute, чтобы это конкретное свойство не сериализовалось.

Пример:

public class Person
{
    public string Name
    {
        get;
        set;
    }

    [XmlIgnore]
    public bool NameSpecified
    {
        get  { return Name != "secret"; }
    }
}
4 голосов
/ 23 июня 2014

Хотя это работает и является довольно коротким решением, шаблон propertyNameSpecified, на мой взгляд, имеет некоторые недостатки (загрязняет интерфейс вашего класса; зависит от имен свойств; вводит неявное поведение).

Если вам нужно реализовать только простое условие (например, не сериализовать значение по умолчанию), тогда атрибут DefaultValue является лучшим выбором.

Дляпример:

public class PurchaseOrder
{
    [DefaultValue("2002")]
    public string Year;
}

Если значение Year имеет значение «2002», оно будет исключено из вывода XML.

0 голосов
/ 08 декабря 2010

Имхо вам понадобится реализовать IXmlSerializable для класса и реализовать методы WriteXml и ReadXml таким образом, чтобы они записывали атрибут только на основе указанных вами условий и могли обрабатывать чтение с или без этого конкретного атрибута, присутствующего при десериализации.

IXmlSerializable на Msdn

0 голосов
/ 08 декабря 2010

Вы можете использовать OnSerializingAttribute при сериализации, что позволяет нам вызывать метод перед сериализацией. Вы можете получить больше информации об этом здесь

...