c#xml序列化不';不能写入空值

c#xml序列化不';不能写入空值,c#,xml,serialization,null,xml-nil,C#,Xml,Serialization,Null,Xml Nil,当我序列化一个包含可空DateTime的c#对象时,有没有一种方法可以将空值保留在xml文件之外,而不是 <EndDate d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" /> 这允许您说明是否希望为空对象使用空元素您可以使用指定的扩展属性来省略空值(或任何其他值)。基本上,创建另一个与序列化属性同名的属性,并将指定的一词作为布尔值添加到末尾。如果指定的属性为true,则它所控制的属

当我序列化一个包含可空DateTime的c#对象时,有没有一种方法可以将空值保留在xml文件之外,而不是

 <EndDate d2p1:nil="true" xmlns:d2p1="http://www.w3.org/2001/XMLSchema-instance" />


这允许您说明是否希望为空对象使用空元素

您可以使用
指定的
扩展属性来省略空值(或任何其他值)。基本上,创建另一个与序列化属性同名的属性,并将指定的
一词作为布尔值添加到末尾。如果指定的
属性为
true
,则它所控制的属性将被序列化。否则,如果它是
false
,则另一个属性将完全从xml文件中删除:

[XmlElement("EndDate")]
public DateTime? EndDate { get; set; }
[XmlIgnore]
public bool EndDateSpecified { get {
    return (EndDate != null && EndDate.HasValue); } }

我知道这是一条旧线索,但万一有人发现:

您还可以为每个属性实现一个公共方法,以检查它是否应该序列化。公约是:

bool ShouldSerialize[YourPropertyName]();
例如,在你的情况下

public bool ShouldSerializeEndDate(){
    return (EndDate != null && EndDate.HasValue);
}

对要可选序列化的每个属性执行此操作。

实际上,这不起作用,因为
DateTime
是一种值类型。从您链接的文档中可以看到:“此外,对于可为null的值类型,您不能将此属性设置为false。当此类类型是null引用(Visual Basic中没有任何内容)时,它们将通过将xsi:nil设置为true进行序列化。”很好的一点是,我确实错过了他处理日期时间的事实,坦斯克指出了这一点,这非常聪明。谢谢是否需要
[XmlElement(“EndDate”)]
?只需
EndDate!=null
结束日期。需要HasValue