什么是循环引用

本文关键字:引用 循环 什么 | 更新日期: 2023-09-27 17:59:00

因此,我在过去处理过JSON序列化的循环引用异常,感觉自己吸取了惨痛的教训,但出现了一个新问题,这让我怀疑我是否真的理解了我必须再次面对的问题。

我的理解是,循环引用异常(就JSON序列化而言)是指子对象引用其父对象,或者任何对象引用自己。这是一个可以理解的异常,删除这些"循环引用"将减轻问题。

我的问题是,我收到了一个循环引用异常,其中一个似乎不可能。我目前正在从一个XML文件读取它的元素列表,然后序列化结果并将其传递给MVC视图。

方法如下:

    public JsonResult GetMakeModelData()
    {
        var path = Server.MapPath("/App_Data/XML/Make_Model_List.xml");
        var doc = XDocument.Load(path);
        var Makes = doc.Root.Elements().Select(x => x.Element("carname")).ToList();
        var jsonResult = Json(Makes, JsonRequestBehavior.AllowGet);
        jsonResult.MaxJsonLength = int.MaxValue;
        return jsonResult;
    }

和XML示例:

<carlist>
  <car>
    <carname>AC</carname>
    <carmodellist>
      <carmodel>Cobra</carmodel>
    </carmodellist>
  </car>
  <car>
    <carname>Acura</carname>
    <carmodellist>
      <carmodel>1.6 EL</carmodel>
      <carmodel>1.7 EL</carmodel>
      <carmodel>2.2 CL</carmodel>
      <carmodel>2.3 CL</carmodel>
      <carmodel>2.5 TL</carmodel>
      <carmodel>3.0 CL</carmodel>
      <carmodel>3.2 CL</carmodel>
      <carmodel>3.2 TL</carmodel>
      <carmodel>3.5 RL</carmodel>
      <carmodel>CL</carmodel>
      <carmodel>CSX</carmodel>
      <carmodel>EL</carmodel>
      <carmodel>Integra</carmodel>
      <carmodel>Legend</carmodel>
      <carmodel>MDX</carmodel>
      <carmodel>NSX</carmodel>
      <carmodel>NSX-T</carmodel>
      <carmodel>RDX</carmodel>
      <carmodel>RL</carmodel>
      <carmodel>RSX</carmodel>
      <carmodel>SLX</carmodel>
      <carmodel>TL</carmodel>
      <carmodel>TSX</carmodel>
      <carmodel>Vigor</carmodel>
    </carmodellist>
  </car>
  ....
</carlist>

现在,正如您所期望的,我得到了从LINQ查询返回的97个元素的列表。当传递到视图时,我得到一个循环引用异常。。。在对象上,只包含97个唯一字符串。异常从哪里来,为什么会发生?!

什么是循环引用

您的问题可能是试图将List<XElement>转换为json,而不是List<string>。每个XElement都有一个对其父元素的引用,而父元素又有一个对子元素的引用。

试试这个,看看它是否有帮助:

x.Element("carname").Value //get the string value instead of the XElement itself