2012-03-07 3 views
0

私は[DataMember(IsRequired=false)]と記されたクラスメンバを持っています。この特定のメンバの値が元のメッセージの中に指定されているかどうかを知りたいと思います。例えば、DataContractSerializerの使用時に値が指定されているかどうかを確認する方法

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public String Name { get; set; } 

    [DataMember(IsRequired=false)] 
    public DateTime BirthDate { get; set; } 
} 

私はDataContractSerializerを使用して、次のメッセージをデシリアライズした場合には、どのように私は、オプション部材BirthDateが指定されていなかったことを知ることができますか?

<Person> 
    <Name>Carlos</Name> 
</Person> 

I部材がデシリアライズされたメッセージの内部に含まれていた場合にフラグを立てるためSpecifiedパターンがあるXmlSerializerため知っています。 DataContractSerializerに相当するものはありますか?

答えて

0

まず、IsRequiredを明示的に偽に設定する必要はありません。デフォルトでは、すでに間違っています。

別の問題は、EmitDefaultValueがデフォルトでtrueに設定されていることです。その結果、DateTimeの値は、シリアル化時に設定しなくても、常に出力されます。この値はデフォルト(DateTime)になります。同様に、DateTimeの値は、たとえ電線にさえいなくても、逆シリアル化時間に常に設定されます。

その結果、何かが有線に接続されているかどうか、まったくわからないことはわかりません。

ここではいくつかのオプションがあります。それは余分な仕事ですが、その価値があります。

  • チェック日付時刻がデフォルトにデシリアライズさと設定されている場合(DateTimeの。)あなたは、あなたのアプリケーションが(日時)をデフォルトに日付を設定しないことを確実にわかっている場合、これはあなたが日付が「wasnことを知ることができます実際にワイヤ上に存在する。

  • もう1つのオプションは、DateTimeを参照型でカプセル化することです。参照型は存在しない場合はnullであるため、(カプセル化参照型がnullでもnullでもあるため)DateTimeの有無をすぐに知ることができます。

  • さらに別のオプションは、

  • 最終的なオプションは、OnDeserializing/OnDeserializingで設定された追加の補完的な変数(おそらくブール値)を追加することです。 OnDeserialized/OnSerializing/OnSerializedを使用して、実際にワイヤ上に何かが存在するかどうかを追跡します。たとえば、実際に日付時刻をシリアル化するときにのみ、この補完的な変数をtrueに設定することができます。

関連する問題