1

basicHttpBindingエンドポイントのみで構成された.NET3.5を対象とするIIS7.5でホストされるWCFサービスアプリケーションを開発しました。OperationContractシグニチャは、そのプロパティの1つがカスタム型である複合型で構成されます。このプロパティが消費側クライアントによって初期化されていない場合、サービスのデシリアライザーはプロパティを無視しているように見え、null/nothingのままになります。null / noneの場合、このカスタムタイプを初期化したいのですが、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
4

1 に答える 1

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
于 2011-05-30T16:29:44.653 に答える