2011-05-30 73 views
1

我開發了一個WCF服務應用程序,該應用程序託管在IIS 7.5中,目標.NET 3.5僅配置了basicHttpBinding端點。 OperationContract簽名由複合類型組成,其中一個屬性是自定義類型。當該屬性未被消費客戶端初始化時,該服務上的解串器似乎忽略該屬性,從而將該屬性留空/無。我想初始化這個自定義類型,如果它null/nothing,我意識到,WCF序列化不會調用構造函數,所以我使用了反序列化回調。回調執行並初始化類型,但在回調完成後立即返回null/nothing。逐步執行代碼,ExtensionData屬性設置器在回調之後立即執行,並且此時我注意到該屬性被重置爲空/無。我錯過了什麼?下面是我的示例代碼WCF反序列化在OnDeserializing回調後將DataMember值重置爲默認值

<DataContract(Name:="Request")> _ 
Public Class Request 
    Implements IExtensibleDataObject 

    <DataMember(Name:="MyCustomType")> 
    Public MyCustomType As CustomType 

    Private _ExtensionDataObject As ExtensionDataObject 

    Public Overridable Property ExtensionData() As ExtensionDataObject Implements IExtensibleDataObject.ExtensionData 
     Get 
      Return _ExtensionDataObject 
     End Get 
     Set(value As ExtensionDataObject) 
      _ExtensionDataObject = value 
     End Set 
    End Property 


    <OnDeserializing()> 
    Sub OnDeserializing(c As StreamingContext) 
     Me.myCustomType = New CustomType() 
    End Sub 

End Class 

回答

1

如果客戶未初始化的屬性,那麼它的價值實際上是Nothing,而事實上,它是空/什麼都不會出現在連載Request對象。所以在反序列化發生之前,你的OnDeserializing方法被調用,並初始化變量;但是隨後會發生反序列化,並且由於該屬性的值(恰好爲Nothing/null),它將覆蓋它。

我想你想要的是有一個OnDeserializ * *回調,反序列化發生後,將初始化成員,如果它的值是無:

<OnDeserialized()> 
Sub OnDeserialized(ByVal c as StreamingContext) 
    If Me.myCustomType Is Nothing Then 
     Me.myCustomType = new CustomType() 
    End If 
End Sub 
+0

感謝您的答覆,該工作。 – confuzed 2011-05-30 16:53:29