2012-01-24 18 views
2

既定では、WCFは、不足している要素を、null、0またはfalseなどの既定値に逆シリアル化します。このアプローチの問題点は、番号0のような基本型の場合、外部システムから送信された実際の値か、WCFによって生成されたデフォルト値のどちらを意味するのか分かりません。データメンバーのデフォルト値、実際に何かが送信されたかどうかを判断する方法は?

私の質問は:実行時に、デフォルト値が「何も送信していない」かどうかを調べることは可能ですか?

これは、外部システムが今回特定の要素(データ破損)を送信しなかったため、データベースの既存のデータをデフォルト値で更新および上書きすることができないため不可欠です。

マイクロソフトの短期的な回答は、「欠落している要素を適切に解釈するには受信側のエンドポイントまで」です。

データメンバのデフォルト値 http://msdn.microsoft.com/en-us/library/aa347792.aspx

誰かが何を意味になって明確にしてくださいことはできますか?

おかげ

+2

あなたはOnDeserializedAttributeを使用することはできますかOnDeserializingAttribute http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspxまたはhttp://msdn.microsoft.com/en- us/library/system.runtime.serialization.ondeserializingattribute.aspx –

+0

null可能なデータメンバーの使用についてはどうですか? http://stackoverflow.com/questions/2426892/wcf-datacontract-does-it-support-nullable-data-member基本的には、データベースにフィールドを保存する前に、ある種のヌルチェックが必要です。 WCFは、欠落している要素をヌル値にデシリアライズできるかどうかを判定します。 – user405723

答えて

3

あなたがプロパティとしてデータメンバーを定義する場合は、セッターがいくつかの値が送られたかどうかを決定するために呼ばれたか否かを使用することができます。以下のコードは、フィールドを直列化解除したかどうかを知る1つのデータコントラクトを示しています。

public class Post_51ca1ead_2f0a_4912_a451_374daab0101b 
{ 
    [DataContract(Name = "Person", Namespace = "")] 
    public class Person 
    { 
     string name; 
     int age; 
     bool nameWasSent; 
     bool ageWasSent; 

     [DataMember] 
     public string Name 
     { 
      get 
      { 
       return this.name; 
      } 

      set 
      { 
       this.nameWasSent = true; 
       this.name = value; 
      } 
     } 

     [DataMember] 
     public int Age 
     { 
      get 
      { 
       return this.age; 
      } 

      set 
      { 
       this.ageWasSent = true; 
       this.age = value; 
      } 
     } 

     [OnDeserializing] 
     void OnDeserializing(StreamingContext ctx) 
     { 
      this.ageWasSent = false; 
      this.nameWasSent = false; 
     } 

     public override string ToString() 
     { 
      return string.Format("Person[Name={0},Age={1}]", 
       nameWasSent ? name : "UNSPECIFIED", 
       ageWasSent ? age.ToString() : "UNSPECIFIED"); 
     } 
    } 

    public static void Test() 
    { 
     MemoryStream ms = new MemoryStream(); 
     DataContractSerializer dcs = new DataContractSerializer(typeof(Person)); 
     dcs.WriteObject(ms, new Person { Name = "John", Age = 30 }); 
     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 

     string noAge = "<Person><Name>John</Name></Person>"; 
     ms = new MemoryStream(Encoding.UTF8.GetBytes(noAge)); 
     object p = dcs.ReadObject(ms); 
     Console.WriteLine("No age: {0}", p); 

     string noName = "<Person><Age>45</Age></Person>"; 
     ms = new MemoryStream(Encoding.UTF8.GetBytes(noName)); 
     p = dcs.ReadObject(ms); 
     Console.WriteLine("No name: {0}", p); 
    } 
} 
+0

ありがとう!明日私は仕事でこれを試してみます。 – user405723

+0

今日はこの解決策を試しましたが、私はそれが魅力のように働いたと言うことができます!それはまさに私が探していたものでした:) – user405723

+0

これはちょうど素晴らしいです。ありがとう! –

関連する問題