循环引用和ScriptIgnore问题

4
我有几个互相引用的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);
    }

仍然出现了CircularReference错误。DateTime数据类型不会导致序列化问题,对吗?

我的类是Entity Framework实体。它只有几个简单的持久化属性,一堆未映射的属性和相当多的静态和实例方法。类定义有点长,无法在此处发布。Json对象实际上在控制器操作的返回行中,并且我已经在上面发布了它。 - CodeWarrior
有趣的是,在尝试实现ISerializable接口失败后,我添加了[Serializable]属性装饰器。现在一切都正常工作了(尽管我特别序列化的属性并不是最终出现在序列化对象中的那些)。如果我移除ISerializable,它会失败。如果我移除[Serializable],它也会失败。 - CodeWarrior
你有没有弄清楚为什么 ScriptIgnore 没有起作用?我也遇到了同样的问题,我的实体被拆分到一个单独的类库中,并尝试在我的 Web 项目控制器中序列化实体。 - bflemi3
恐怕我没有。在上面的情况下,我最终只返回了一个匿名类型,在另一个实例中,创建了一些DTO来存储我想要返回的数据。 - CodeWarrior
1个回答

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中选择新的匿名类型,获取我需要的属性。那应该可以工作。

起初我想这样做,不过在从数据库检索后,我需要调用一些其他的SearchAnalysis方法来填充一些属性。 - CodeWarrior
为什么这与使用LINQ创建新的匿名集合作为最终步骤有冲突呢? :) - Paweł Staniec
我猜这是一种间接的方式,询问是否返回匿名类型对象将允许我调用实例方法以使用未映射的属性值来填充它们。 - CodeWarrior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接