繁体   English   中英

序列化复杂类型System.Nullable <System.DateTime>

[英]Serialize Complex Type System.Nullable<System.DateTime>

我想序列化DateTime,以便当DateTime为null时,我不会得到标签本身。

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

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

有什么办法吗?

看到这个问题 ,马克给出了一个很好的答案。 只需将ShouldSerializeMyDateTime方法添加到您的类中:

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

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

您可能需要实现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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM