Возможно, вам потребуется реализовать 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>