2015-03-10 5 views
7

Ich habe ein Beispielprojekt erstellt. Ich Serialisierung folgende Typen:Serialisieren und Deserialisieren von Typ T, abgeleitet von Dictionary <string, T>, mit Json.NET

[JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
public class SampleTree : Dictionary<string, SampleTree> 
{ 
    [JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
    public SampleClass Value { get; set; } 

    [JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
    public SampleTree Parent { get; set; } 
} 

[JsonObject(IsReference = true)] 
public class SampleClass 
{ 
    public string A { get; set; } 

    public int B { get; set; } 

    public bool C { get; set; } 
} 

Programmcode (Konsolenanwendung der Einfachheit halber):

static void Main(string[] args) 
{ 
    var tree = new SampleTree 
    { 
     Value = new SampleClass 
     { 
      A = "abc", 
      B = 1, 
      C = true 
     }, 
     Parent = null 
    }; 

    var treeChild = new SampleTree 
    { 
     Value = new SampleClass 
     { 
      A = "def", 
      B = 2, 
      C = false 
     }, 
     Parent = tree 
    }; 

    tree.Add("firstChild", treeChild); 

    var serializerSettings = new JsonSerializerSettings 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.All, 
     ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
     Formatting = Formatting.Indented 
    }; 

    var serialized = JsonConvert.SerializeObject(tree, serializerSettings); 

    var deserialized = JsonConvert.DeserializeObject<SampleTree>(serialized, serializerSettings); 

    var d = deserialized; 
} 

Das Ergebnis der Serialisierung ist einfach perfekt: Ergebnis-String enthält alle Daten, die ich auf die geputtet habe Baum vorher. Die Deserialisierung dieser Zeichenfolge mit den gleichen Serializer-Einstellungen ist jedoch falsch: Das Ergebnisobjekt enthält keine untergeordneten Elemente. Vielleicht ist das Hauptproblem die Attribute ... Was ist der Grund für ein solches Verhalten?

Antwort

0

Anstatt Dictionary in Main-Funktion zu deklarieren, habe ich gerade eine Eigenschaft namens Children des Typs Dictionary zu SampleTree selbst hinzugefügt (und Vererbung ofc entfernt).

0

Ich bin mir nicht sicher, das ist, was Sie verlangten.

using Newtonsoft.Json; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      Dictionary<string, SampleTree> tree = new Dictionary<string, SampleTree>(); 
      var a = new SampleTree 
      { 
       Value = new SampleClass 
       { 
        A = "abc", 
        B = 1, 
        C = true 
       }, 
       Parent = null 
      }; 

      var treeChild = new SampleTree 
      { 
       Value = new SampleClass 
       { 
        A = "def", 
        B = 2, 
        C = false 
       }, 
       Parent = a 
      }; 

      tree.Add("parent", a); 
      tree.Add("child", treeChild); 

      var serializerSettings = new JsonSerializerSettings 
      { 
       PreserveReferencesHandling = PreserveReferencesHandling.All, 
       ReferenceLoopHandling = ReferenceLoopHandling.Serialize, 
       Formatting = Formatting.Indented 
      }; 

      var serialized = JsonConvert.SerializeObject(tree, serializerSettings); 

      var deserialized = JsonConvert.DeserializeObject<Dictionary<string, SampleTree>>(serialized, serializerSettings); 

      var d = deserialized; 
     } 
    } 

    [JsonObject(IsReference = true, ItemReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
    public class SampleTree 
    { 
     [JsonProperty(ReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
     public SampleClass Value { get; set; } 

     [JsonProperty(IsReference = true, ReferenceLoopHandling = ReferenceLoopHandling.Serialize)] 
     public SampleTree Parent { get; set; } 
    } 

    [JsonObject(IsReference = true)] 
    public class SampleClass 
    { 
     public string A { get; set; } 

     public int B { get; set; } 

     public bool C { get; set; } 
    } 

} 

Das funktionierte einwandfrei für mich. Lass es mich wissen, wenn du das wolltest.

+0

Das ist nah an meiner Lösung. Anstatt Dictionary in der Main-Funktion zu deklarieren, habe ich gerade eine Eigenschaft namens Children des Typs Dictionary zu SampleTree selbst hinzugefügt (und die Vererbung vonc entfernt). Aber die Hauptfrage ist: Wie bekomme ich diese Arbeit, wenn ich die Vererbung nicht entfernen möchte? –

Verwandte Themen