【问题标题】:How to serialize nullable DateTime in a WCF DataContract?如何在 WCF DataContract 中序列化可为空的 DateTime?
【发布时间】:2015-09-14 06:32:47
【问题描述】:

我无法序列化这个东西。

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 Storm 中刷新客户端...谢谢,请将其发布为答案

标签: c# wcf nullable datacontractserializer datacontract


【解决方案1】:

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

客户端现在仍然需要一个 DateTime(因此不允许 null),但服务器正在发送一个 null。因此例外。

请更新客户端服务参考。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 2010-09-17
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多