![](/img/trans.png)
[英]“Property 'System.DateTime Date' is not defined for type 'System.Nullable`1[System.DateTime]' (Parameter 'property')” exception
[英]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.