【问题标题】:WCF Deserialization resets DataMember value to default after OnDeserializing callbackWCF 反序列化在 OnDeserializing 回调后将 DataMember 值重置为默认值
【发布时间】:2011-05-30 13:59:56
【问题描述】:

我开发了一个托管在 IIS 7.5 中的 WCF 服务应用程序,目标是 .NET 3.5,仅配置了一个 basicHttpBinding 端点。 OperationContract 签名由一个复合类型组成,其中一个属性是自定义类型。当消费客户端未初始化此属性时,服务上的反序列化程序似乎会忽略该属性,使其为空/无。如果它为空/无,我想初始化这个自定义类型,并且我意识到 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

【问题讨论】:

    标签: wcf deserialization datamember


    【解决方案1】:

    如果客户端没有初始化该属性,那么它的值实际上是Nothing,并且它为null/Nothing的事实将出现在序列化的Request对象中。所以在反序列化发生之前,你的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多