2012-08-06 128 views
0

我有一個關於WCF和反序列化XML的問題。WCF反序列化

比方說,我有一個XSD,指定一些屬性爲minoccurs ='0'。

<xs:element name=TestData> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element minOccurs=0 name="stoppageHours> 
     <xs:simpleType> 
      <xs:restriction base="xs:int"> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
     <xs:element minOccurs=0 name="stoppageDate> 
     <xs:simpleType> 
      <xs:restriction base="xs:dateTime"> 
      </xs:restriction> 
     </xs:simpleType> 
     </xs:element> 
    <xs:sequence> 
    <xs:complexType> 
</xs:element> 

如果我沒有價值的一個屬性,我可以省略元素標記的XML即

<TestData> 
    <StoppageHours>26</StoppageHours> 
    ...omitted stoppageDate... 
</TestData> 

但是,鑑於本人產生從XSD到.NET C#類,當我發佈XML到我的Web服務時,它抱怨反序列化失敗了,因爲它期望元素?

如何強制反序列化過程忽略丟失的XML元素並將相關類的記憶器設置爲NULL值?我已經嘗試將類成員設置爲系統可空類型,但爲了讓這個工作,我必須將XML元素作爲xsi:nillable傳遞?我真正想要做的就是簡單地省略XML標籤。

謝謝。

+0

那些不是屬性 - 你定義的XML **元素**有'minOccurs = 0' – 2012-08-06 14:47:47

+0

類似的問題:http://stackoverflow.com/questions/8709424/do-xml-parsers-tell-在xsinil-true-and-omitted-elements之間的區別 – JTMon 2012-08-06 15:02:58

回答

0

允許此功能的屬性稱爲EmitDefaultValue。在服務端你的數據合同可能會是這個樣子:

[DataContract] 
public class TestData 
{ 
    [DataMember(EmitDefaultValue = false)] 
    public int StoppageHours { get; set; } 

    [DataMember(EmitDefaultValue = false)] 
    public DateTime StoppageDate { get; set; } 
} 

當EmitDefaultValue等於假,它告訴數據合同串行WCF中刪除從輸入的元素,如果其值等於默認值。對於值類型,如果序列化程序不存在,序列化程序將在服務器端將該值設置爲默認值。所以如果你通過

<TestData></TestData> 
當它被WCF收到

這種情況下你的對象將是這些值服務器端:

<TestData> 
    <StoppageHours>0</StoppageHours> 
    <StoppageDate>1/1/0001 12:00:00 AM</StoppageDate> 
</TestData> 

編輯:其他的事情,你可能需要做根據您的反饋DataMember上的註釋也被設置爲IsRequired屬性。當我測試這個屬性應該默認爲false,但你可以試着在合同定義中明確。更新後的合同現在看起來是這樣的:

[DataContract] 
public class TestData 
{ 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public int StoppageHours { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public DateTime StoppageDate { get; set; } 
} 

當值設置爲true,並且節點缺少我得到一個序列化異常。當IsRequired設置爲false時,我可以發送一個空請求:

<TestData></TestData> 

並且沒有序列化異常。如果這不起作用,那麼你可能需要清除臨時的asp.net文件並重新啓動服務。測試時遇到這個問題。希望這可以幫助。

+0

Thnaks phil,我確實看過這個選項,但似乎無法使它正常工作。我發現包括EmitDefaultValue = false對序列化具有期望的效果,但不具有反序列化。我仍然收到一個錯誤,指出某個元素丟失了。 – Milesh 2012-08-07 08:22:28

+0

最後,我已經在xsd中設置了元素值,並使用xsd.exe從我的xsd生成了類。生成的類屬性被定義爲可爲空的類型。XML代表null,然後以的形式傳遞給WCF服務以指示null。我需要空值而不是默認值才能傳入服務。如果任何人有任何想法可以做到這一點,如果沒有我喜歡聽到的nillable屬性。謝謝。 – Milesh 2012-08-07 08:26:11

+0

我已經用WCF序列化的第二個潛在問題更新了我的答案。 – 2012-08-07 14:31:55