2009-07-24 12 views
4

J'ai une classe qui hérite actuellement du dictionnaire, puis y ajoute quelques propriétés de membre de première classe. En gros:JSON Sérialisation avec classe héritant du Dictionnaire <T,V>

public class Foo : Dictionary<string, string> 
{ 
    public string Bar { get; set; } 
    public string Baz { get; set; } 
} 

Sur sérialisation une instance de cet objet JSON cependant, il semble que le sérialiseur émet uniquement les appariements clé/valeur que j'emmagasinés dans le dictionnaire. Même si j'applique des attributs DataMember aux nouvelles propriétés de 1ère classe, le sérialiseur JSON ne semble pas savoir quoi faire avec ces propriétés et les ignore à la place. Je suppose qu'il y a quelque chose de fondamentalement élémentaire qui me manque, mais en parcourant les exemples de code et les docs sur le sérialiseur JSON de .net, j'ai seulement trouvé des exemples triviaux qui ne correspondent pas vraiment à ce que je fais. Toutes nos autres classes qui dérivent d'une autre classe de base ne semblent pas présenter ce problème, c'est celle qui dérive du dictionnaire générique en particulier qui nous donne des ajustements. [Modifier] À moins de déplacer un dictionnaire dans Foo en tant que propriété de première classe, y a-t-il un moyen de le faire fonctionner? Je suppose que le serializer ne sait pas quoi nommer le dictionnaire pour le distinguer des autres membres?

+0

duplication possible de [Comment puis-je convertir un dictionnaire en une chaîne JSON en C#?] (Http://stackoverflow.com/questions/5597349/how-do-i-convert-a-dictionary-to-a- json-string-in-c) –

Répondre

3

Peut-être une solution composition base serait mieux dans ce cas:

using System; 
using System.Collections.Generic; 
using System.Runtime.Serialization.Json; 
using System.IO; 
using System.Text; 

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo { Bar = "bar", Baz = "baz" }; 
     foo.Items.Add("first", "first"); 

     DataContractJsonSerializer serializer 
      = new DataContractJsonSerializer(typeof(Foo)); 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, foo); 
      Console.WriteLine(Encoding.Default.GetString(ms.ToArray())); 
     } 
    } 
} 

public class Foo 
{ 
    public Dictionary<string, string> Items { get; set; } 
    public string Bar { get; set; } 
    public string Baz { get; set; } 

    public Foo() 
    { 
     this.Items = new Dictionary<string, string>(); 
    } 
} 

produit cette sortie:

{"Bar":"bar","Baz":"baz","Items":[{"Key":"first","Value":"first"}]}

Serait-ce résoudre votre problème comme une solution de contournement?

+0

Andrew tu m'as battu au punch, je modifiais mon original comme tu l'avais posté .. J'espère ne pas avoir à changer le cours de Foo car c'est un morceau d'héritage et on le touche beaucoup, mais si je ne peux pas sérialiser cette chose à travers le fil, ma main pourrait être forcée. – bakasan

+0

@bakasan Au lieu de modifier lui-même Foo, pouvez-vous créer un objet de transfert de données plus facile à sérialiser (comme l'exemple d'Andrew), et l'initialiser avec les données de Foo? –

+0

@Gabe ooh, c'est une idée brillante, et en fait je pourrais créer une méthode d'extension rapide et sale pour intégrer la conversion juste avant de passer à la sérialisation ... le tout sans toucher les milliers de places Foo est utilisé. Merci les gars! (et merci dieu pour les méthodes d'extension) – bakasan

Questions connexes