用JSON序列化与MVC3和EF4 CTP5w循环引用除外
-
25-09-2019 - |
题
我在与一个循环引用问题,当我尝试经由EF4 CTP5返回串行化处理的对象。使用im代码优先的方法和简单的POCO为我的模型。
我已经加入[ScriptIgnore]属性到一个对象提供一个反向引用的任何属性和烦人每似乎很好地工作,如果我手动实例化POCO的,即它们序列化到JSON细,并且scriptignore属性是公认的。然而,当我尝试和串行化处理从DAL返回的对象我得到的圆形引用异常“而串行化类型的对象时检测到循环引用‘System.Data.Entity.DynamicProxies.xxxx’”
我试图检索数据,的几种方法,但他们都得到坚持了这个错误:
public JsonResult GetTimeSlot(int id) {
TimeSlotDao tsDao = new TimeSlotDao();
TimeSlot ts = tsDao.GetById(id);
return Json(ts);
}
下面作品的方法稍好如,而不是使所述圆形REFFERENCE其约会对象的时隙动态代理对象。
public JsonResult GetTimeSlot(int id) {
TimeSlotDao tsDao = new TimeSlotDao();
var ts = from t in tsDao.GetQueryable()
where t.Id == id
select new {t.Id, t.StartTime, t.Available, t.Appointment};
return Json(ts);
}
任何想法或解决问题的对策?
<强>更新强> 我宁愿用通过的NuGet的开箱即串行器如果有可能的,虽然Json.Net是OK作为一种替代我希望它可以使用它,因为我打算,以及...
解决方案
我也有类似的问题与IIS托管WCF服务,并试图序列POCO与DataContractJsonSerializer类对象。内置的JSON序列化似乎并没有处理所有循环引用。我可以通过使用 JSON.net 串行,只是返回JSON字符串处理系列化自己绕过它从我的方法。该JSON.net串行器有一个选项忽略循环引用作为JSON本身不支持它们。
其他提示
不管我做代理一直是一个棘手的问题的动态,因为我竟然在我的模型中删除所有循环引用!但仍是问题依然存在。
我试图Json.Net但发生同样的问题。
在结束我偶然发现后约使用自定义JavaScriptConverter
HTTP:/ /hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-generated-classes/
实施代码和鲍勃你叔叔一切工作
我解决了这个,而不必诉诸于外部JSON序列。在我对象上下文的构造一个nutshull我禁用ProxyCreation。
我不知道为什么这样的作品,但我贴的后续问题的这里
我用下面ContractResolver。请注意,我从CamelCaseContractPropertyResolver继承获得该功能为好,但你从DefaultContractResolver继承直接也可以。
using System;
using System.Collections.Generic;
using System.Reflection;
using Newtonsoft.Json.Serialization;
namespace MyNamespace
{
/// <summary>
/// This class enables EntityFramework POCO objects to be serialized. In some cases POCO
/// objects are subclassed by a proxy which has an additional member _entityWrapper. This
/// object prevents serialization (circular references and references to non-serializable types).
/// This removes the _entityWrapper from the list of members to be serialized.
/// </summary>
public class ContractResolver : CamelCasePropertyNamesContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
if (objectType.FullName.StartsWith("System.Data.Entity.DynamicProxies."))
{
var members = base.GetSerializableMembers(objectType);
members.RemoveAll(memberInfo => memberInfo.Name == "_entityWrapper");
return members;
}
return base.GetSerializableMembers(objectType);
}
}
}
要使用它,创建串行器,然后设置ContractResolver属性到这个类的一个新实例:
var ser = JsonSerializer.Create(sJsonSerializerSettings);
ser.ContractResolver = new ContractResolver();
我遇到过这个问题了。回答这个主题包含多种解决方案。 的鸿业孙发现/环路参考处理功能于caaffaf7" 相对=‘nofollow’>环参考在网络API 强>
处理