2017-05-17 7 views
3

Ich versuche, einen Baum zu deserialisieren, wo jeder Knoten einen Verweis von sowohl seinem übergeordneten als auch seinem untergeordneten Knoten hat. Das Serialisieren des Baums funktioniert problemlos, aber das Deserialisieren des Baums behält die übergeordnete Referenz nicht bei. Stattdessen wird es eine Null.C# Doppelt verknüpfte Baumdeserialisierungsproblem

Was, was ich versuche vereinfachte zu tun:

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 

static class MainClass { 
    public static void Main() { 
     var node = new Node(null); 
     node.AddChild(); 

     var settings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, Formatting = Formatting.Indented }; 

     //serializing 
     string json1 = JsonConvert.SerializeObject(node, settings); 
     Console.WriteLine("Before deserializing:"); 
     Console.WriteLine(json1); 
     Console.WriteLine(); 

     //deserializing 
     node = JsonConvert.DeserializeObject<Node>(json1, settings); 

     //serializing again 
     string json2 = JsonConvert.SerializeObject(node, settings); 
     Console.WriteLine("After deserializing:"); 
     Console.WriteLine(json2); 
     Console.WriteLine(); 

     Console.ReadLine(); 
    } 
} 

[JsonObject(IsReference = true)] 
class Node { 
    public Node Parent = null; 
    public List<Node> Children = new List<Node>(); 

    public Node(Node parent) { 
     this.Parent = parent; 
    } 

    public void AddChild() { 
     this.Children.Add(new Node(parent: this)); 
    } 
} 

Der Ausgang ist dies:

Before deserializing: 
{ 
    "$id": "1", 
    "Parent": null, 
    "Children": [ 
    { 
     "$id": "2", 
     "Parent": { 
     "$ref": "1" 
     }, 
     "Children": [] 
    } 
    ] 
} 

After deserializing: 
{ 
    "$id": "1", 
    "Parent": null, 
    "Children": [ 
    { 
     "$id": "2", 
     "Parent": null, 
     "Children": [] 
    } 
    ] 
} 

Ist das ein Fehler in Json.net? Gibt es eine Möglichkeit, das zu beheben?

+1

Ich würde eine rekursive Funktion schreiben, um diese Verweise nach Deserialisieren zu beheben. –

Antwort

0

Ich bin mir nicht sicher, was das Problem mit JSON ist, aber wenn Sie Kinder ohne Elternreferenzen haben, dann können Sie es beheben.

Hier ist eine Ausführung des Vorschlags von Ed Plunkett:

public void fixParents(Node parent) 
{ 
    foreach(Node child in parent.Children) 
    { 
     fixParents(child); 
     child.Parent = parent; 
    } 
} 
Verwandte Themen