序列化类型为“****”的对象时检测到循环引用。

问题:

2个类:MetaSet和MetaObject,为1:N的关系。

在Asp.net mvc2.0下,返回Json数据时,出现“序列化类型为“DataCenter.Core.Domain.MetaSet”的对象时检测到循环引用。”

Mvc代码如下:

  IList<MetaSet> sets = new List<MetaSet>();
  sets = _metaSetRepository.GetMetaSetByParentTreeCodeID(treeCodeID, CheckState.yes);
     if (Request.IsAjaxRequest())
        {
               return new JsonResult
                {
                    Data =sets,
                    JsonRequestBehavior= JsonRequestBehavior.AllowGet
                };
  }

数据操作代码如下:

  public IList<MetaSet> GetMetaSetByParentTreeCodeID(string treeCodeID, CheckState state)
        {
            
            var query = Session.CreateQuery(@" select m from MetaSet m where m.TreeCode like :treecodeid and m.IsDelete=False and m.CheckState=:checkState order by m.TreeCode asc")
                       .SetString("treecodeid", treeCodeID + "%").SetEnum("checkState", state);
            return query.List<MetaSet>();
         

        }

原因:

  在MVC里面返回一个json对象的数据,在这个过程中将我们找到的这条数据进行序列化为json对象的一个过程。在这个过程的时候,由于这个对象有映射 关系,那么它在序列化MetaSet对象的时候会序列化该对象的属性MetaObject对象,而这个属性MetaObject对象又有属性MetaSet对象,依次反复。就导致了这个问题的产生。

解决方案:

规避json序列化的时候直接序列化该MetaSet对象,改为序列化不带这种映射关系的对象;

        public IList<MetaSet> GetMetaSetByParentTreeCodeID2(string treeCodeID, CheckState state)
{

var query = Session.CreateQuery(@" select new MetaSet(m.MetaSetID,m.Name,m.ParentID,m.ControllerAction) from MetaSet m where m.TreeCode like :treecodeid and m.IsDelete=False and m.CheckState=:checkState order by m.TreeCode asc")
.SetString("treecodeid", treeCodeID + "%").SetEnum("checkState", state);
return query.List<MetaSet>();


}



参考:

http://archive.cnblogs.com/a/1956117/

转载于:https://www.cnblogs.com/lzm525/archive/2011/10/18/2216114.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值