2013-02-08 131 views
1

我在嘗試序列化一個對象,該對象的字段和屬性用[DataMember(IsRequired = false,EmitDefaultValue = false)]裝飾] 我無法更改這些對象到源代碼),我需要能夠序列化所有字段和屬性,無論它們的值如何。 我嘗試過使用NullValueHandling.Include,但它沒有區別。是否有不同的設置可以讓我指示JSON.Net序列化這些屬性?如何在序列化對象字段和屬性時忽略EmitDefaultValue = false

這是一個非常簡單的示例類(同樣,記住,我不能以任何方式改變這一類):

[Serializable] 
[DataContract] 
class SampleClass2 
{ 
    public SampleClass2() 
    { 
     dow = daysOfWeek.Mon; 
    } 

    public enum daysOfWeek { Mon = 0, Tue = 1, Wed = 2, Thu = 3, Fri = 4, Sat = 5, Sun = 6 }; 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public daysOfWeek dow; 
} 

而且我使用的序列化的代碼:

public static void TestSerializeSampleClass2() 
    { 
     SampleClass2 sc2 = new SampleClass2(); 
     sc2.dow = SampleClass2.daysOfWeek.Mon; 

     string json = ""; 

     Newtonsoft.Json.JsonSerializerSettings jss = 
      new Newtonsoft.Json.JsonSerializerSettings() { DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, NullValueHandling = Newtonsoft.Json.NullValueHandling.Include }; 
     // jss.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
     json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss); 
     Console.WriteLine(json); 


     sc2.dow = SampleClass2.daysOfWeek.Tue; 
     json = Newtonsoft.Json.JsonConvert.SerializeObject(sc2, jss); 
     Console.WriteLine(json); 


     Console.WriteLine(""); 
     Console.ReadLine(); 
    } 

從運行這個輸出:

{} { 「陶氏」:1}

Zero(0)是枚舉的默認C#值,所以當「dow」設置爲「Mon」時,序列化的JSON爲空,而在第二次嘗試時,使用「Tue」,我確實得到1的值。

我開始寫自己的ContractResolver,不得不放棄。最初的「GetSerializableMembers」代碼會對內部方法進行大量調用,我想避免將大量代碼覆蓋/複製到我自己的項目中。我相信可能有一個我在某處丟失的設置。

任何幫助將不勝感激。

由於提前,

古斯塔沃

+0

爲什麼?它會正確地反序列化。 – EJP 2013-02-08 23:48:33

+0

不是。該對象不會被C#使用。它正在通過瀏覽器上的JavaScript控制進行反序列化。該控件當前失敗,因爲它無法找到該屬性。謝謝。 – 2013-02-11 20:52:55

+1

我嘗試了舊版本的JSON.NET庫(v3.5.0),它實際上忽略了EmitDefaultValue屬性。我現在正在使用它作爲解決方法。最近增加了對EmitDefaultValue的支持,我仍然無法找到覆蓋它的方法,而不改變被序列化的類(在這種情況下我不允許這樣做)。 – 2013-02-18 18:36:43

回答

相關問題