如何在WCF数据合约中序列化可空的日期时间

本文关键字:序列化 时间 日期 WCF 数据 | 更新日期: 2023-09-27 18:12:46

我在序列化这个东西时有麻烦。

namespace Such.Namespace.Wow
{
    [DataContract(Namespace = "http://very.namespace.uh")]
    public class DogeResponse
    {
        [DataMember]
        public virtual int Foo { get; set; }
        [DataMember]
        public virtual DateTime? ExpiringDate { get; set; }
    }
}

生成的WSDL:

<xs:complexType name="DogeResponse">  
<xs:sequence>
<xs:element minOccurs="0" name="Foo" type="xs:int"/>  
<xs:element minOccurs="0" name="ExpiringDate" nillable="true" type="xs:dateTime"/>  
</xs:sequence></xs:complexType>

但是运行时出现异常并返回XML错误:

<SerializationException>
<Message>ValueType 'System.DateTime' cannot be null.</Message>

是的,我看到了一个"类似"的问题,但它是关于旧的。net中的ASMX服务。

我想知道如何在。net 4.5 WCF服务中做到这一点?

如何在WCF数据合约中序列化可空的日期时间

看起来您首先有一个DateTime(在服务器端和客户端),然后您将DateTime修改为可空的DateTime,但没有更新客户端。

客户端现在仍然期望一个DateTime(所以不允许null),但是服务器正在发送一个null。因此出现了例外。

请更新客户端服务参考

小心解析XML。元素不是有效的空值。这被认为是一个空字符串,因此不能转换为日期时间。要为null,需要有特殊的nill=true属性

澄清:如果您有一个book xml元素,其中一个子元素是book:series,那么在填写它时您有几个选项:

完全删除元素——当您希望表明该系列不适用于本书或该书不是该系列的一部分时,可以这样做。在这种情况下,将永远不会调用具有与book:series匹配模板的xsl转换(或其他基于事件的处理器)。例如,如果您的xsl将book元素转换为表行(xhtml:tr),那么使用此方法可能会得到不正确的表单元格数(xhtml:td)。将元素保留为空——这可能表明该系列是",或者是未知的,或者该图书不是该系列的一部分。将调用与book:series匹配的任何xsl转换(或其他基于事件的解析器)。current()的值将为"。使用此方法将获得与下一个描述的方法相同数量的xhtml:td标记。使用xsi:nil="true" -这表示book:series元素为NULL,而不仅仅是空。将调用具有模板匹配book:series的xsl转换(或其他基于事件的解析器)。current()的值将为空(不是空字符串)。此方法与(2)的主要区别在于book:series的模式类型不需要允许空字符串(")作为有效值。这对于系列元素没有实际意义,但是对于在模式中定义为枚举类型的语言元素,xsi:nil="true"允许元素没有数据。另一个例子是decimal类型的元素。如果你想让它们为空,你可以联合一个只允许"和一个小数的枚举字符串,或者使用一个可为空的小数。