2013-02-08 1 views
1

Je tente de sérialiser un objet qui a des champs et des propriétés décorés avec [DataMember (IsRequired = false, EmitDefaultValue = false)] Je ne peux pas modifier ces objets (pas d'accès au code source) et je dois être en mesure de sérialiser tous les champs et propriétés indépendamment de leur valeur. J'ai essayé d'utiliser NullValueHandling.Include, mais cela ne faisait aucune différence. Existe-t-il un paramètre différent qui me permettrait d'ordonner à JSON.Net de sérialiser ces propriétés?Comment ignorer EmitDefaultValue = false lors de la sérialisation des objets et des propriétés

Voici une classe exemple très simple (encore une fois, gardez à l'esprit que je ne peux pas changer cette classe de quelque façon):

[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; 
} 

Et le code que je me sers pour sérialiser:

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(); 
    } 

La sortie de l'exécution ceci:

{} { "dow": 1}

Zéro (0) est la valeur C# par défaut pour les énumérations, donc lorsque "dow" est défini sur "Mon" le JSON sérialisé est vide, alors que lors de la seconde tentative, en utilisant "Tue" j'obtiens la valeur 1.

J'ai commencé à écrire mon propre contratResolver et j'ai dû abandonner. Le code "GetSerializableMembers" original fait beaucoup d'appels aux méthodes internes et je voudrais éviter d'avoir à surcharger/copier une grande partie du code sur mon propre projet. Je crois qu'il pourrait y avoir un paramètre qui me manque quelque part.

Toute aide serait grandement appréciée.

Merci à l'avance,

Gustavo

+0

Pourquoi? Il se désérialisera correctement de toute façon. – EJP

+0

Pas vraiment. L'objet ne sera pas consommé par C#. Il est désérialisé par le contrôle JavaScript sur un navigateur. Le contrôle échoue actuellement car il ne peut pas trouver la propriété. Merci. –

+1

J'ai essayé une ancienne version de la bibliothèque JSON.NET (v3.5.0) et ignore l'attribut EmitDefaultValue. J'utilise cela comme une solution de contournement pour le moment. La prise en charge d'EmitDefaultValue a été ajoutée récemment et je n'ai toujours pas réussi à trouver un moyen de l'écraser sans modifier la classe en cours de sérialisation (ce que je ne suis pas autorisé à faire dans ce cas). –

Répondre

Questions connexes