2017-05-17 15 views
3

各ノードが親と子の両方の参照を持つツリーを逆シリアル化しようとしています。ツリーをシリアライズすることは問題なく動作しますが、それを逆シリアル化しても親参照は保持されません。代わりにnullになります。私は単純化された何をしようとしている何C#二重化されたツリーの逆シリアル化の問題

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": [] 
    } 
    ] 
} 

が、これはJson.netのバグです:

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

出力はありますか?これを修正する方法はありますか?

+1

私はデシリアライズ後にこれらの参照を修正するために再帰関数を記述します。 –

答えて

0

JSONの問題はわかりませんが、親参照のない子がある場合は修正できます。

ここでエド・プランケットの提案の実行です:

public void fixParents(Node parent) 
{ 
    foreach(Node child in parent.Children) 
    { 
     fixParents(child); 
     child.Parent = parent; 
    } 
} 
関連する問題