将nHibernate查询序列化为JSON
在深入研究Fluent nHibernate时,我发现了使用它的潜在破坏者……
给出以下POCO代码。
public class Customer { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual Details Details { get; set; } } public class Details { public virtual int Id { get; set; } public virtual IList Orders { get; set; } } public class CustomerMap : ClassMap { // perform mapping } public class DetailsMap : ClassMap { // perform mapping }
我加载了ASP.NET MVC并尝试使用Json Serialization。
using System.Web.Script.Serialization; public static partial class JsonExtensions { public static string ToJson(this object item) { return new JavaScriptSerializer().Serialize(item); } }
而且,当我从ToJson
上下文传递查询到ToJson
方法时,我收到了错误!
序列化“System.Reflection.RuntimeModule”类型的对象时检测到循环引用。
无论是拉一个对象,还是一个对象列表,它似乎都是这样做的。 我甚至尝试将我的类标记为[Serializable]
,结果相同。 使用Microsoft Entity Framework Code-Only方法的完全相同的类不会发生这种情况。
我可以不将nHibernate DTO反序列化为JSON吗?
添加更多代码以供检查。
using (var session = sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { var customers= session.CreateCriteria(typeof(Customer)).List(); foreach (var customer in customers) { Console.WriteLine(customer.ToJson()); } Console.ReadLine(); } }
这只是一种预感,但您可能想要研究它实际上尝试序列化的类型 – nHibernate在运行时为每个POCO生成代理(因此它可以执行诸如延迟加载外键实体之类的内容等)。 这可能是您收到此错误的原因。
尝试指定要序列化的确切类型,或者创建一个全新的对象来序列化,用nHibernate POCO填充其属性。
编辑:这似乎更像是你的问题的答案:
http://www.west-wind.com/WebLog/posts/147218.aspx
基本上,检查所有POCO的任何循环引用(例如,订单POCO作为财产的客户POCO,而订单POCO有客户列表作为财产)