Десериализация WCF сбрасывает значение DataMember по умолчанию после обратного вызова OnDeserializing - PullRequest
1 голос
/ 30 мая 2011

Я разработал приложение службы WCF, размещенное в IIS 7.5 и предназначенное для .NET 3.5, настроенное только с конечной точкой basicHttpBinding. Сигнатура OperationContract состоит из составного типа, где одно из его свойств является настраиваемым типом. Когда это свойство не инициализируется потребляющим клиентом, десериализатор в службе, похоже, игнорирует свойство, оставляя его пустым / пустым. Я хотел бы инициализировать этот пользовательский тип, если он равен нулю / ничего, и я понимаю, что сериализация WCF не вызывает конструкторов, поэтому я использовал обратный вызов десериализации. Обратный вызов выполняет и инициализирует тип, но сразу после завершения обратного вызова это свойство возвращается к нулю / ничего. Шагая по коду, установщик свойства ExtensionData выполняется сразу после обратного вызова, и именно в этот момент я замечаю, что свойство сбрасывается в ноль / ничего. Что мне не хватает? Вот мой пример кода

 <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 Ответ

1 голос
/ 30 мая 2011

Если клиент не инициализировал свойство, то его значение на самом деле равно 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
...