什么是循环参考?

时间:2014-04-18 15:41:49

标签: c# xml linq serialization

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

1 个答案:

答案 0 :(得分:3)

可能您的问题是,您尝试将List<XElement>转换为json,而不是List<string>。每个XElement都有一个对其父元素的引用,该元素具有一个返回其子元素的引用,因此您将获得循环引用。

请尝试使用此功能,看看是否有帮助:

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