我开发了一个托管在IIS 7.5中的WCF服务应用程序,其目标是.NET 3.5,仅配置了basicHttpBinding端点。 OperationContract签名由Composite类型组成,其中一个属性是自定义类型。当消费客户端未初始化此属性时,服务上的反序列化器似乎忽略该属性,使其保留为null / nothing。我想初始化这个自定义类型,如果它为null / nothing,我意识到WCF序列化不调用构造函数,所以我使用了反序列化回调。回调执行并初始化类型,但在回调完成后立即返回null / nothing。逐步执行代码,ExtensionData属性setter在回调之后立即执行,此时我注意到该属性被重置为null / nothing。我错过了什么?这是我的示例代码
<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
答案 0 :(得分:1)
如果客户端没有初始化该属性,那么它的值实际上是Nothing
,并且序列化的Request对象中存在null / Nothing的事实。因此,在反序列化发生之前,将调用OnDeserializing方法,并初始化变量;然后反序列化发生,并且由于属性的值(恰好是Nothing / null),它将覆盖它。
我认为你想要的是有一个OnDeserializ * ed *回调,它会在反序列化发生后初始化成员,如果它的值是Nothing:
<OnDeserialized()>
Sub OnDeserialized(ByVal c as StreamingContext)
If Me.myCustomType Is Nothing Then
Me.myCustomType = new CustomType()
End If
End Sub