2015-09-14 83 views
1

我无法序列化这个东西。如何序列化WCF DataContract中的可空DateTime?

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> 

是的,我看到了一个 “类似” 的问题,但它是关于ASMX服务在较老的.NET中。

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

+0

抛出这个exeption在哪里?在服务器端还是客户端?你是否首先有一个不可为空的DateTime,并将其更改为可为空的DateTime?那么,你是否也刷新了你的客户端参考? –

+0

先生,看起来你是正确的,它看起来像我没有刷新WCF风暴客户端...谢谢,请将它发布为答案 – evictednoise

回答

1

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

客户端现在仍然期望DateTime(所以不允许空),但服务器发送空值。因此例外。

请更新客户端服务参考。

0

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

一个澄清: 如果你有一本书的XML元素和子元素之一是书:系列你加油吧外出时有几种选择:

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