我想序列化DateTime,以便当DateTime为null时,我不会自己获取标记。
我还设置了为上面指定的bool但我的问题是DateTime是值类型它永远不会为null因此指定的bool将始终为true。
我甚至尝试将DateTime替换为System.Nullable,但在发送请求或从WebService接收响应时出现序列化错误。
有什么出路吗?
答案 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>