【问题标题】:Self-referencing loop error when attempting serialization尝试序列化时出现自引用循环错误
【发布时间】:2015-05-18 18:54:50
【问题描述】:

我正在尝试序列化一个对象(特别是a distance object in the opensource UnitClassLibrary)。因为这个库显然不支持序列化,所以我愿意为我的目的对其进行修改。

但是,我不确定如何诊断正在发生的这个问题。尝试使用 JSON.net 序列化对象时出现以下错误(我也尝试使用内置工具进行 XML 序列化并得到类似的错误)。

Additional information: Self referencing loop detected for property 'EqualityStrategy' with type 'UnitClassLibrary.DistanceEqualityStrategy'. Path ''.

但是,我似乎在代码中找不到任何距离对象的自引用循环。我该如何诊断这个问题?

我目前只是尝试像这样进行序列化:

        Distance newDistance = new Distance();
        var json = JsonConvert.SerializeObject(newDistance);

这是导致错误的原因。我可以修改我正在使用的库,但我没有。

【问题讨论】:

  • 请发布您修改后的目标代码。
  • 试图澄清 EBrown。
  • 问题可能是因为public DistanceEqualityStrategy EqualityStrategy 对象本身是两个Distance 对象的delegate。这就是问题所在。您需要指定 JSON 序列化器和 XML 序列化器,而不是序列化该对象。 ([ScriptIgnore], [XmlIgnore])
  • 我会试试的。我目前无法引用 System.Web,因为 UCL 是 PCL,但我可以制作非 PCL 版本,因为这并不重要。
  • 因为你使用的是 json.net,所以属性应该是[JsonIgnore]

标签: c# serialization visual-studio-2013 json.net unit-class-library


【解决方案1】:

在过去,我曾看到当对象中有一个嵌套对象引用回原始对象时会导致此问题。

例如,假设您有一个名为 Project 的对象,它有一个对象类型 User 的属性。现在 User 对象内部是一个嵌套对象,它引用回原始 Project 对象。

我已经能够通过使用以下 JsonSerializerSetting 忽略嵌套循环序列化。

在下面的示例中,projects 是 Project 对象的列表。

string json = Newtonsoft.Json.JsonConvert.SerializeObject(projects, Newtonsoft.Json.Formatting.Indented,
                new Newtonsoft.Json.JsonSerializerSettings()
                    {
                        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
                    }
                );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 2012-01-26
    相关资源
    最近更新 更多