2015-09-14 82 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」允許元素不含數據。另一個例子是十進制類型的元素。如果你希望它們是空的,你可以聯合一個只允許「」和一個小數的枚舉字符串,或者使用一個可以刪除的小數。