2012-04-02 9 views
4

WebサービスレイヤのWCFに異常があります。DataContractクラスのWCFプライベートメンバー参照がNULLになる

WCFで私のクラスのプライベートメンバー(_Wagon)をインスタンス化すると(このインスタンス化はnullではありません)、数秒後にnullになります。

私は問題を診断しようとしていますが、これまでのところ結果はありません。

私はあなたにこの問題を解決するのを手伝ってくれています。

ありがとうございます。

[DataContract] 
public class RemoteWagon 
{ 
    private readonly IWagon _Wagon; 

    public RemoteWagon(IWagon Wagon) 
    { 
     _Wagon = Wagon; //_Wagon isn't null here 
    } 

    ~RemoteWagon() 
    { 
     Trace.WriteLine("Do nothing"); 
    }  

    [DataMember] 
    public RemoteBreakpoint Breakpoint 
    { 
     set 
     { 
      if (value == null) 
      { 
       _Wagon.Breakpoint = null; //_Wagon member is NULL... 
      } 
      else 
      { 
       //... useless code in this context. 
      } 
     } 
    }  
} 
+0

は、すべてのインスタンス化と単一WCF呼び出しのコンテキストを起こっ 'RemoteWagon'クラスと協力して、または複数の呼び出しにわたってpublic [DataMember]プロパティとして公開? – mellamokb

+1

'RemoteWagon'のインスタンスは、クライアントからサーバーへ2回の間にワイヤを介して送信されましたか?基本的には、WCFはクラスの** public shape **を直列化するだけです** - それは '[DataMember]'属性でマークされたものです。それ以外のものは**電線を経由して輸送されないため、通信リンクの反対側では利用できません。 –

答えて

2

この(クライアントとサーバー間でデータを送信する場合など)、あなたのクラスは、DataContractSerializerによって直列化および非直列化されていた場合はどうなる

いくつかの参照:DataContractSerializer doesn't call my constructor?

このような場合は、その後、一つの可能​​な解決策、それは私のために働い:https://stackoverflow.com/a/9419943/724944

をだから、この問題の簡単なチェック&修正が(私はあなたがフィールドを自分で初期化し、それをシリアル化しないようにしたいと仮定)メソッドを作成するために、次のようになります。

[OnDeserializing] 
private void OnDeserializing(StreamingContext c) 
{ 
    _Wagon = initializeWagon(); 
} 

しかし、気づいたように、デシリアライズ時にはワゴンを渡すことができません。別の方法で初期化する必要があります。一方

、あなたは_Wagonがシリアライズされた場合は、[

1

あなたがしたい場合は_Wagonは、あなたがデータメンバーとしてそれをマークし、その上で「読み取り専用」を捨てなければならない連載ようだ:

は、したがって、私のコードがあります。シリアライズしたくない場合は、このオブジェクトを作成して記入するコードを示してください。

関連する問題