序列化复杂类型System.Nullable <system.datetime> </system.datetime>

时间:2009-08-06 08:01:10

标签: c# xml xml-serialization

我想序列化DateTime,以便当DateTime为null时,我不会自己获取标记。

我还设置了为上面指定的bool但我的问题是DateTime是值类型它永远不会为null因此指定的bool将始终为true。

我甚至尝试将DateTime替换为System.Nullable,但在发送请求或从WebService接收响应时出现序列化错误。

有什么出路吗?

2 个答案:

答案 0 :(得分:4)

this question,Marc给出了一个很好的答案。只需在您的班级中添加ShouldSerializeMyDateTime方法:

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

显然,这是XML序列化的一个未记录的功能...您还可以使用名为MyDateTimeSpecified的属性

答案 1 :(得分:1)

您可能需要实施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以查看备用行为。这将根据它是否存在于XML中来写入和读取MyDateTime值:

<?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>