簡體   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