2012-03-07 54 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> 

我知道用於XmlSerializer存在用於是否包含一個部件的內部被反序列消息標記所述Specified圖案。有沒有相當於DataContractSerializer

回答

0

首先,您不需要明確設置IsRequired爲false。默認情況下,它已經是假的。

另一個問題是,EmitDefaultValue是 - 默認情況下 - 設置爲true。因此,即使您從未將其設置爲序列化時間,也會始終發送DateTime的值。此值將是默認值(DateTime。)類似地,DateTime的值將始終設置爲反序列化時間,即使它甚至不在線上!

因此,您甚至無法分辨電線上是否有東西,根本不是開箱即用。

但您在這裏有幾個選項。這是額外的工作,但值得。

  • 檢查的日期時間進行反序列化,並設置爲默認值(日期時間)。如果你肯定知道你的應用程序將永遠不會設置爲默認(日期時間)的日期,這可以讓你知道的日期WASN」實際上存在於電線上。

  • 您擁有的另一個選項是將DateTime封裝在引用類型中。由於引用類型爲空(如果不存在),因此如果存在或不存在DateTime,則可以立即知道它(因爲封裝引用類型將爲非null或null。)

  • 還有另一種選擇是使用可空的日期時間DataMember(即類型將是「日期時間?」而不是「日期時間」。)

  • 最後一個選項是添加一個額外的互補變量(可能是布爾值),它設置在OnDeserializing/OnDeserialized/OnSerializing/OnSerialized並使用它來跟蹤線路上是否實際存在某些東西。例如,只有在實際序列化日期時間時,纔可以將此互補變量設置爲true。

相關問題