C# Json.NET中每个树节点序列化前后的自定义代码

C# Json.NET中每个树节点序列化前后的自定义代码,c#,json.net,C#,Json.net,我正在尝试使用Json.Net序列化二叉树: class Node { Node Left; Node Right; int Data; } 我想在每个节点序列化前后添加自定义代码,因此我尝试使用自定义JsonConverter: class NodeConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectTyp

我正在尝试使用Json.Net序列化二叉树:

class Node
{
    Node Left;
    Node Right;
    int Data;
}
我想在每个
节点
序列化前后添加自定义代码,因此我尝试使用自定义
JsonConverter

class NodeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(Node);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Console.WriteLine("Before");
        serializer.serialize(writer, value); // Oops
        Console.WriteLine("After");
    }   
}
但是这不起作用,因为
JsonSerializer
将无休止地调用
NodeConverter.WriteJson(..)
方法

这可以在Json.NET中完成吗

编辑: 以下是我使用自定义转换器的方式:

var root = CreateTree(); 
using (var ms = new MemoryStream())
using (var writer = new StreamWriter(ms))
{
    var serializer = JsonSerializer.Create();
    serializer.Converters.Add(new NodeConverter());
    serializer.serialize(writer, root);
}

为了中断循环,您可以直接序列化
WriteJson
方法中的属性,例如:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    Console.WriteLine("Before");
    var n = (Node)value;
    writer.WriteStartObject();
    SerializeReferencedNode(writer, serializer, "Left", n.Left);
    SerializeReferencedNode(writer, serializer, "Right", n.Right);
    writer.WritePropertyName("Value");
    writer.WriteValue(n.Data);
    writer.WriteEndObject();
    Console.WriteLine("After");
}

private static void SerializeReferencedNode(JsonWriter writer, JsonSerializer serializer, 
                                            string propName, Node node)
{
    if (node != null)
    {
        writer.WritePropertyName(propName);
        serializer.Serialize(writer, node);
    }
}
这将导致一个简单示例的以下输出:

{"Left":{"Value":123},"Right":{"Value":246},"Value":0}

哪个自定义节点?。请您添加更多详细信息以了解您的情况好吗correctly@er-sho自定义代码,而不是节点(为了简单起见,我想在每个节点序列化前后打印“Before”和“After”)。演示如何使用此转换器?@er sho当然,编辑了问题您可以修改
节点
类型以添加序列化回调吗?如有,请参阅。