循环引用和ScriptIgnore问题

时间:2012-02-13 16:21:53

标签: c# json asp.net-mvc-3 serialization circular-reference

我有几个相互引用的BusinessObject类,我需要在JsonResponse中序列化一个并将其返回到我的视图中。我一直得到循环引用异常,我无法摆脱它。我已将[ScriptIgnore()]装饰器放在每个不是简单数据类型属性的属性上,我仍然得到异常。我无法弄清楚问题出在哪里,因为我几乎阻止了所有的序列化程序,而且它仍然在淹没我。

有没有办法看到它们当前状态的序列化对象是什么?

    [HttpPost]
    public JsonResult GetAnalysisInfo(int id)
    {
        ProjectContext myDB = db;
        SearchAnalysis searchanalysis = SearchAnalysis.Find(myDB, id);
        //searchanalysis.Results = searchanalysis.SearchResultsPrototype(myDB);
        return this.Json(searchanalysis);
    }

更新

我也试过实现ISerializable无济于事。我的GetObjectData非常简单:

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("SearchAnalysisId", this.SearchAnalysisId);
        info.AddValue("Created", this.Created);
    }

仍然收到CircularRefernce错误。 DateTime数据类型不会导致序列化问题吗?

1 个答案:

答案 0 :(得分:1)

我正在做的是防止该错误是返回反映我的对象属性的匿名类型,如下所示:

    public JsonResult CompanyListJson()
    {
        var list = (from companies in appContext.Companies
                    where companies.Active.Equals(true)
                    select new
                    {
                        Name = companies.DbName,
                        Id = companies.Id,
                        Active = companies.Id.Equals(CurrentCompany.Id)

                    });
        return Json(list, JsonRequestBehavior.AllowGet);
    }

也许这不是最好的方式,但它允许我保持我的JSON很薄并且只推送我需要的数据(并且当然避免循环引用异常)

查看您的示例,我将从SearchAnalysis中选择新的匿名类型,获取我需要的属性。这应该工作