集合序列化中的newtonsoft json自引用循环错误

时间:2018-12-17 08:50:22

标签: c# json json.net

我为集合的内部元素编写了一个紧凑的json转换程序

public class CompactConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return true;            
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize(reader);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var formating = writer.Formatting;
        writer.Formatting = Formatting.None;
        serializer.Serialize(writer, value);
        writer.Formatting = formating;            
    }
}

在我的序列化对象深处的某处有这些项目:

[JsonConverter(typeof(CompactConverter))]
public class DynamicUtilParam
{
    public string Name { get; set; }

    public int Field { get; set; }

    public bool IsDate { get; set; }

    public string Comment { get; set; }

    [OnSerializing]
    internal void OnSerializing(StreamingContext content)
    {
        if (string.IsNullOrEmpty(this.Comment))
        {
            this.Comment = null;
        }
    }

    [OnDeserialized]
    internal void OnDeserialized(StreamingContext context)
    {
        if (this.Comment == null)
        {
            this.Comment = string.Empty;
        }
    }
}

如果我评论JsonConverterAttribute,一切都可以序列化,但是内部元素并不紧凑。我尝试使用此属性对其进行序列化,结果是“检测到类型为'ConfigurationConverter.DynamicUtilParam'的自引用循环。路径为'UtilParams'。”

serialized = JsonConvert.SerializeObject(config, Formatting.Indented,
                    new JsonSerializerSettings
                    {
                        NullValueHandling = NullValueHandling.Ignore,
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    }
                });

原因是什么,我该如何解决?

附言:如果我通过JsonSerializerInternalWriter进行调试,我会发现_serializeStack.Contains(value)为true。

0 个答案:

没有答案