使用JsonConverter属性来防止自引用循环

时间:2014-02-17 01:03:40

标签: c# json.net

我收到以下错误:“检测到属性的自引用循环'DefaultAssignTo'”

这是我正在尝试序列化的课程:

public class Account
{
    public int Id { get; set; }
    public string AccountName { get; set; }

    [JsonConverter(typeof(AccountConverter))]
    public virtual Account DefaultAssignTo { get; set; }
    public int? DefaultAssignToId { get; set; }

    public virtual ICollection<Role> Roles { get; set; }

    [JsonConverter(typeof(OtherConverter))]
    public virtual Other Other { get; set; }
    public int? OtherId { get; set; }

    [JsonIgnore]
    public string OtherName
    {
        get
        {
        return "Name = " + this.AccountName;
        }
}
}

我知道我可以通过添加如下设置来阻止这种情况,但在尝试反序列化时会导致问题。

var settings = new JsonSerializerSettings()
{
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
    PreserveReferencesHandling = PreserveReferencesHandling.All
};

如您所见,我创建了几个自定义转换器。 Other类的一个工作,但Account类的一个永远不会被调用。我猜这是因为,当ContractResolver到达DefaultAssignTo时,AccountAccount已签订合同,因此永远不会使用自定义转换器。

以下是我的问题:

  1. 有没有办法让这个自定义转换器工作? (以及如何或指出一些信息,以便我能够弄明白。)
  2. 如果无法回答#1:

    1. 我的猜测为什么它不能正常工作?
    2. 有哪些替代方案?
    3. 编辑:(我最终想要实现的用例如下所示)

      Account将被分配给某个人。 (例如Task)当Account创建Task时,如果DefaultAssignedTo不为空,则将Task分配给{{1}的值}}。 DefaultAssignedTo可以引用包含DefaultAssignedTo的其他AccountAccount

      因此,如果两个帐户中有两个DefaultAssignedTo John和Jane,其中Accounts设置为John。当Jane创建DefaultAssignedTo时,它将被分配给John,当John创建任务时,它将被分配给John。 Jane将按预期序列化,但John抛出自引用循环异常。

      编辑: 我应该明确表示我不希望或要求Task成为完整的序列化。自定义转换器的目的是删除导致自引用循环的原因,但仍然序列化DefaultAssignedTo中包含的其他数据。

0 个答案:

没有答案