2011-08-07 5 views
7

私はデータコントラクトクラスのContractInvariantMethodを書かれているし、このタイプのオブジェクトは、私のサービスに送信し、データ契約デシリアライザは、それをデシリアライズしようとすると、コードの契約のチェックがで取得されたとき、すべてがしかし、クライアント側で素晴らしい作品途中でContractExceptionを投げ、不変式が失敗したと言っています。 その理由は、クラスの(デフォルト)コンストラクタで、私は不変を満たすようにプロパティを設定されていることが、オブジェクトが直列化復元されたときに明らかにコンストラクタが呼び出されません。 これには解決策がありますか?ここデータコントラクトのデシリアライズでコードコントラクトを動作させる方法は?

は私のデータコントラクトクラスです:

[DataContract] 
public class DataContractClass 
{ 
public DataContractClass() 
{ 
    this.Field1= this.Field2= -1; 
} 
[DataMember] 
public int Field1 {get; set;} 
[DataMember] 
public int Field2 {get; set;} 

[ContractInvariantMethod] 
private void Invariants() 
{ 
    Contract.Invariant(this.Field1== -1 || this.Field2== -1); 
} 
} 
+0

あなたは私達にあなたのコードの例を示すことができますか?それは助けるかもしれません。 –

+0

質問を変更してコードを追加しました。 – Arash

答えて

6

実行時検査の際、不変量は、各パブリックメソッドの最後に確認 です。

ので、シリアライザは、デシリアライザは、コンストラクタを使用していけないので、あなたが契約例外を取得-1にないプロパティ1とProperty2を設定したとき。

だから、これを使用します。

public DataContractClass() 
{ 
    SetDefaults(); 
} 

[OnDeserializing] 
private void OnDeserializing(StreamingContext context) 
{ 
    SetDefaults(); 
} 

private void SetDefaults() 
{ 
    Property1 = -1; 
    Property2 = -1; 
} 
+0

この問題を解決する方法が問題です。 – svick

+0

はい、そうですが、動作させる方法はありますか?いずれかのプロパティが設定される前に、オブジェクトが直列化復元されたときに実行して、コンストラクタを強制するような? – Arash

+0

@svick今すぐ解決して – Skomski

関連する問題