编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用

先说下开发环境,不一样的没法解决,再看看其他的解决方案吧:.Net Frameword 4.5 + MVC5

实际应用是这样的,我调用存储过程,返回了DataTable,我不想转Model之类的,想直接DataTable返回Json对象,代码如下:

[AllowAnonymous]
        public ActionResult Page()
        {
            Dictionary<string, object> result = new Dictionary<string, object>();
            result.Add("code", 200);
            PurchaseDao dao = new PurchaseDao();
            string goods = "db";
            string produce = "";
            string spec = "";
            string xml = "<r Goods=\"" + goods + "\" Produce=\"" + produce + "\" Spec=\"" + spec + "\"/>";
            DataTable table = dao.Purchase_Get_Goods(xml, 1, 20);
            CPager page = dao.Pager;
            Dictionary<string, object> data = new Dictionary<string, object>();
            data.Add("page", 1);
            data.Add("records", table.Rows.Count);
            data.Add("total", page.TotalPages);
            data.Add("rows", table);
            result.Add("data", data);
            result.Add("info", "相应成功!");
            return Json(result, JsonRequestBehavior.AllowGet);
        }

直接报错:序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用

首先,查了网上的方案。

方案1:

JsonSerializerSettings setting = new JsonSerializerSettings()
{
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
var ret = JsonConvert.SerializeObject(data, setting);
return Json(ret, JsonRequestBehavior.AllowGet);

这样处理,是不报错了,但是,它给我返回了字符串了,而不是json对象,因为我前端是给表格取值,不是直接ajax请求的,所以要处理的话还得修改表格控件,太麻烦了。

方案2:

web.config文件下加入如下代码,可能是我加的方式不对,无效。

<!--解决ajax返回datatable问题-->
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization>
<converters>
<add name="DataSetConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter" />
<add name="DataRowConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter" />
<add name="DataTableConverter" type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter" />
</converters>
</jsonSerialization>
</webServices>
</scripting>
</system.web.extensions>

最后,我是这样解决的,新增方法,DataTable转List

public List<Dictionary<string, object>> SerializeDataTable(DataTable dt)
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
    foreach (DataRow dr in dt.Rows)//每一行信息,新建一个Dictionary<string,object>,将该行的每列信息加入到字典
    {
        Dictionary<string, object> result = new Dictionary<string, object>();
        foreach (DataColumn dc in dt.Columns)
        {
            result.Add(dc.ColumnName, dr[dc].ToString());
        }
        list.Add(result);
    }
    return list;//调用Serializer方法 
}

然后,

data.Add("rows", SerializeDataTable(table));

通过这样的方法,解决了序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用报错的问题。

未经允许不得转载: 技术文章 » .NET编程 » 序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用