【问题标题】:What exactly is a circular reference?究竟什么是循环引用?
【发布时间】:2014-06-03 03:49:42
【问题描述】:

所以我过去曾用 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 个唯一字符串。异常来自哪里,为什么会发生?!

【问题讨论】:

  • 当引用完全是圆形时。
  • @Servy 我承认这让我很开心。
  • @Servy 你的评论没有帮助
  • 是时候进行建设性的了。我会在 Linq 查询之后设置一个断点并深入研究 Makes 中返回的内容。也许你没有得到你所期望的。

标签: c# xml linq serialization


【解决方案1】:

您的问题可能是您尝试将List&lt;XElement&gt; 转换为json,而不是List&lt;string&gt;。每个XElement 都有一个对其父元素的引用,该父元素有一个对其子元素的引用,因此您会得到循环引用。

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

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

【讨论】:

  • 你是对的,生成的 JsonResult 中的 Data 属性包含System.Collections.Generic.List&lt;System.Xml.Linq.XElement&gt;
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 2015-08-26
  • 2014-10-28
  • 2012-08-27
  • 2010-11-12
  • 2011-03-18
  • 2011-01-22
相关资源
最近更新 更多