在OnDeserializing回调之后,WCF反序列化将DataMember值重置为默认值

问题描述

| 我已经开发了一个IIS 7.5中托管的WCF服务应用程序,该应用程序针对仅配置了basicHttpBinding终结点的.NET 3.5。 OperationContract签名由Composite类型组成,其中其属性之一是自定义类型。当使用方客户端未初始化此属性时,服务上的反序列化器似乎会忽略该属性,从而使其保持null / nothing。如果此自定义类型为null / nothing,我想对其进行初始化,并且我意识到WCF序列化不会调用构造函数,因此我使用了反序列化回调。回调执行并初始化该类型,但是在回调完成后,此属性立即返回null / nothing。逐步执行代码,ExtensionData属性设置器将在回调之后立即执行,并且在这一点上,我注意到该属性被重置为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
    

解决方法

        如果客户端未初始化属性,则其值实际上为
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
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...