Сериализация сложного типа System.Nullable <System.DateTime> - PullRequest
2 голосов
/ 06 августа 2009

Я хочу сериализовать DateTime так, чтобы когда DateTime был нулевым, я не получал сам тег.

Я также установил bool, указанный выше, но моя проблема в том, что DateTime имеет тип значения, он никогда не будет нулевымследовательно, указанный bool всегда будет верным для него.

Я даже пытался заменить DateTime на System.Nullable, но я получаю ошибку сериализации при отправке запроса или получении ответа от WebService.

Есть ли способвне дома?

Ответы [ 2 ]

4 голосов
/ 06 августа 2009

См. этот вопрос , где Марк дает превосходный ответ. Просто добавьте метод ShouldSerializeMyDateTime в ваш класс:

public bool ShouldSerializeMyDateTime()
{
    return MyDateTime.HasValue;
}

Очевидно, это недокументированная особенность сериализации XML ... Вы также можете использовать свойство с именем MyDateTimeSpecified

1 голос
/ 06 августа 2009

Возможно, вам потребуется реализовать IXmlSerializable и вручную сериализовать ваш тип, после чего вы сможете использовать Nullable<DateTime>. Вот пример:

public class MyData : IXmlSerializable
{
    public Nullable<DateTime> MyDateTime { get; set; }

    public void WriteXml(XmlWriter writer)
    {
        if (this.MyDateTime.HasValue)
        {
            writer.WriteStartElement("MyDateTime");
            writer.WriteValue((DateTime)this.MyDateTime);
            writer.WriteEndElement();
        }
    }

    public void ReadXml(XmlReader reader)
    {
        if (reader.ReadToDescendant("MyDateTime"))
        {
            this.MyDateTime = reader.ReadElementContentAsDateTime();
        }
    }

    public XmlSchema GetSchema()
    {
        return null;
    }
}

Используя это:

MyData md = new MyData { MyDateTime = null };
XmlSerializer ser = new XmlSerializer(typeof(MyData));
using (var writer = XmlWriter.Create(@"d:\temp\test.xml"))
{
    ser.Serialize(writer, md);
}

using (var reader = XmlReader.Create(@"d:\temp\test.xml"))
{
    md = (MyData)ser.Deserialize(reader);
    WL(md.MyDateTime.HasValue);
}

Измените эту первую строку на MyDateTime = DateTime.Now, чтобы увидеть альтернативное поведение. Это записывает и читает значение MyDateTime в зависимости от того, присутствует ли оно в XML:

<?xml version="1.0" encoding="utf-8"?>
<MyData />

<?xml version="1.0" encoding="utf-8"?>
<MyData>
    <MyDateTime>2009-08-06T10:10:14.8311049+01:00</MyDateTime>
</MyData>
...