2011-01-18 3 views
0

を初期化していないいくつかの理由プライベート初期化された変数は、私はこのような継承された、部分クラス上のDataContract持っ

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 

namespace Domain 
{ 
    [DataContract] 
    public partial class IdCard : DomainObject<System.Int64> 
    { 
    private Group _grp; 

    [DataMember] 
    public virtual Group Grp 
    { 
     get { return _grp; } 
     set { _grp = value; } 
    } 

    private bool _unproxized = true; 
    public override object UnProxy() 
    { 
     if (this._unproxized) // this prevents stackoverflow with cyclical references 
     { 
      this.Grp = (Group)this.Grp.UnProxy(); 
      this._unproxized = false; 
     } 

     return this; 
    } 
    } 
} 

を、_unproxizedがtrueに設定されることはありません。なぜどんなアイデア?

私は単純にロジックを切り替えることができますが、なぜメンバー変数が初期化されていないのか不思議です。

+0

申し訳ありませんが、どのように初期化されていないという結論に達しましたか? –

+0

まず、ブール値のデフォルトはfalseであることがわかります。第2に、条件内のコードは決して呼び出されません。第三に、条件付きでデバッガで検査すると、それは誤りです。 –

+0

"プライベート初期化変数が初期化されていません"。質問のタイトルはパラドックスです。 – Amy

答えて

4

は、あなたがデシリアライズされて見ているインスタンスをしていますか?標準のDataContractデシリアライゼーションでは、コンストラクタは呼び出されず、DataMembersだけが割り当てられます。あなたが見ている変数は、DataMemberとしてマークされていません。

このthreadは、ほぼ同じ例を使用して見ている動作の実装について説明しています。

+0

完璧!ありがとうございました。 –

0

ウェブ/サービスの参照を使用している疑いがあります。この場合、コード(プライベート変数)は決してクライアントに届きません。

+0

あなたは正しいですが、私はサーバー側の変数について話しています。 –

0

は、このようなコンストラクタでvariblesを割り当てよう:

public IdCard() 
{ 
    _unproxized = true; 
} 
+0

合意しました、それは解決策です。私は解決策を求めていませんが、なぜ初期化されていないのかを尋ねています。 –

2

デシリアライズ時に、DataContract serialiserはリフレクションのタイプを使用して完全に初期化されていないオブジェクトインスタンスを作成し、データを適用するからです。そのため、DataContract serialiserにはパラメータのないコンストラクタは必要ありません。 (追加しても、呼び出されません)。 _unproxiedフィールドに[DataMember]という属性を付けた場合はtrueになります。

+0

いい説明と合理的に聞こえる、あなたはそれをサポートするための参照がありますか? MSのバグトラッカー(connect.microsoft.com)に報​​告しなければならないバグのようです –

関連する問題