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?
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? –