Может ли XmlSerializer десериализоваться в Nullable <int>? - PullRequest
5 голосов
/ 16 декабря 2009

Это дубликат Может ли XmlSerializer десериализоваться в Nullable ? , но мне нужно решение, которое не изменяет XML-документ и не заставляет меня реализовать интерфейс IXmlSerializable. Я не хочу реализовывать IXmlSerializable, потому что у меня есть много дополнительных элементов помимо <number>, которые правильно десериализованы.

Мой xml может содержать либо элемент <number>4</number>, либо <number/>

<root>
...
either <number>4</number> or <number/>
... [other elements]
</root>

Класс

public class root
{
public int? number {get; set;}
...
}

не работает.

Ответы [ 2 ]

9 голосов
/ 19 декабря 2009

Вы можете просто использовать суррогатное имущество.

public class MyType1
{
    // XmlIgnore means it is not directly serialized
    [XmlIgnore]
    public int? number
    {
        get; set;
    }

    // acts as a surrogate for the nullable property
    [XmlElement("number")]
    public string _number_Surrogate
    {
        get
        {
            return (number.HasValue) ? number.ToString() : "";
        }
        set
        {
            if (!value.Equals(""))
            {
                number = Int32.Parse(value);
            }
        }
    }

    public System.DateTime Time
    {
        get; set;
    }
}
0 голосов
/ 27 января 2010

Вы всегда можете сделать замену строки в окончательном выводе xml.

Replace(" i:nil=\"true\"/>","/>");

Как правило, это плохая идея, чтобы попытаться взломать xml с помощью манипуляции со строками, но приведенная выше замена безопасна и всегда конвертирует <anything i:nil="true"/> в <anything/>.

Это взлом, но приемлемый, учитывая альтернативу.

...