【问题标题】:A circular reference was detected while serializing an object of type error?序列化类型错误的对象时检测到循环引用?
【发布时间】:2018-01-16 21:08:37
【问题描述】:

我将这个从服务器返回到 JSON,一个 jquery 数据表,但它返回错误:

System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.
   at WebServices.himher.getUsers1(Int32 iDisplayLength, Int32 iDisplayStart, Int32 iSortCol_0, String sSortDir_0, String sSearch)

.cs代码:

public void getUsers1(int iDisplayLength, int iDisplayStart, int iSortCol_0, string sSortDir_0, string sSearch)
{
    try
    {
        basicoperation bop = new basicoperation();
        DataTable dt;

        dt = bop.getUsers(iDisplayLength, iDisplayStart, iSortCol_0, sSortDir_0, sSearch); // fetching users

        dt.TableName = "usersDT1";

        //int iTotalRecords=0;
        //int iTotalDisplayRecords= 0;

        var retObj = new
        {
            iTotalRecords= 20,
            iTotalDisplayRecords= 10,
            aaData= dt
        };

        //string json = JsonConvert.SerializeObject(dt);

        JavaScriptSerializer js = new JavaScriptSerializer();

        Context.Response.Write(js.Serialize(retObj));
    }
    catch (Exception ex)
    {

        throw ex;
    }
}

【问题讨论】:

  • 异常信息非常清楚。您的数据模型中有一个无法序列化的循环引用。使 DTO 成为应到达视图的仅选择数据,而不是整个数据表

标签: c# asp.net json asmx


【解决方案1】:

问题是你的retObj 包含一个DataTable,它不能按原样序列化为 JSON,因为它里面有循环引用。

本文展示了序列化数据表的不同方法;

http://www.c-sharpcorner.com/UploadFile/9bff34/3-ways-to-convert-datatable-to-json-string-in-Asp-Net-C-Sharp/

我的首选可能是最后一种方式

using Newtonsoft.JSON;  

public string DataTableToJSONWithJSONNet(DataTable table) {  
   string JSONString=string.Empty;  
   JSONString = JSONConvert.SerializeObject(table);  
   return JSONString;  
}  

【讨论】:

    【解决方案2】:

    很明显,您的代码 aaData= dt 中有一个循环引用。
    你可以使用下面的代码来解决这个问题,

    JsonConvert.SerializeObject(retObj, Formatting.None, 
                        new JsonSerializerSettings {ReferenceLoopHandling = 
                                              ReferenceLoopHandling.Ignore});
    

    【讨论】:

      【解决方案3】:

      解决这个问题的一个更简单的方法是返回一个字符串,并使用 JavaScriptSerializer 将该字符串格式化为 json。

      public string GetEntityInJson()
      {
         JavaScriptSerializer j = new JavaScriptSerializer();
         var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute });
         return j.Serialize(entityList );
      }
      

      “选择”部分很重要,它在视图中选择您想要的属性。某些对象具有父对象的引用。如果不选择属性,如果只是将表作为一个整体,可能会出现循环引用。

      不要这样做:

      public string GetEntityInJson()
      {
         JavaScriptSerializer j = new JavaScriptSerializer();
         var entityList = dataContext.Entitites.toList();
         return j.Serialize(entityList );
      }
      

      如果您不想要整个表格,请改为这样做:

      public string GetEntityInJson()
      {
         JavaScriptSerializer j = new JavaScriptSerializer();
         var entityList = dataContext.Entitites.Select(x => new { ID = x.ID, AnotherAttribute = x.AnotherAttribute });
         return j.Serialize(entityList );
      }
      

      这有助于用更少的数据渲染视图,只使用您需要的属性,并使您的网络运行得更快。

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 2012-12-01
        • 1970-01-01
        • 2015-01-21
        • 2010-11-12
        • 2013-04-23
        • 2010-10-14
        • 1970-01-01
        相关资源
        最近更新 更多