当需要传递 JsonCoverters 时,如何使用 JsonConvert.SerializeObject() 处理错误检测到的引用循环?

How do I handle erroneously-detected reference loops with JsonConvert.SerializeObject() when JsonCoverters need to be passed?

我们需要使用版本控制来序列化对象,因此我们将它们封装在一个信封中:

protected void OnStateChanged(Object state) 
{
    var envelope = new WorkerStateData<Object> 
    {
        StateVersion = workerConfig.CurrentStateVersion,
        Value = state
    };
    String serializedState = JsonConvert.SerializeObject(envelope, new VersionConverter());
}

对于我们需要序列化的实体之一,Newtonsoft 正在检测引用循环。我已经通过强制序列化 ReferenceLoopHandling.Serialize:

确认不存在这样的循环
var serializeSettings = new JsonSerializerSettings();
serializeSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
String serialized = JsonConvert.SerializeObject(state, Formatting.Indented, serializeSettings);

此测试序列化成功,没有引用循环。

问题是似乎没有接受 JsonSerializerSettingsJsonConverter[]JsonConvert.SerializeObject 的重载。如果没有这两个功能,我无法将此修复程序集成到我们的主代码库中。

谁能建议另一种绕过参考循环检查的方法?

JsonSerializerSettings 有一个 属性,这是一个转换器列表:

JsonConvert.SerializeObject(envelope, Formatting.Indented, new 
        JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
            Converters = new List<JsonConverter> { },
        });

请查看我提交给 Json.Net 团队的这个 github issue。我们遇到的问题是由于我们覆盖了 类.

之一中的默认 Equals() 方法

虽然确实没有引用循环,但更新 Json.Net 以处理此类情况可能会破坏向后兼容性。长话短说,来自 Json.Net 的指导是按照此问题的已接受答案中的建议使用自定义序列化程序设置。