【问题标题】:Serialize nHibernate query to JSON将 nHibernate 查询序列化为 JSON
【发布时间】:2010-11-18 01:07:42
【问题描述】:

在深入研究 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> Orders { get; set; }
}

public class CustomerMap : ClassMap<Customer>
{
 // perform mapping
}
public class DetailsMap : ClassMap<Details>
{
 // perform mapping
}

我加载了 ASP.NET MVC 并尝试使用 Json 序列化。

using System.Web.Script.Serialization;

    public static partial class JsonExtensions
    {
        public static string ToJson(this object item)
        {
            return new JavaScriptSerializer().Serialize(item);
        }
    }

而且,当我将一个查询从我的 nHibernate 上下文传递到 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<Customer>();

                foreach (var customer in customers)
                {
                    Console.WriteLine(customer.ToJson());
                }
                Console.ReadLine();
            }
        }

【问题讨论】:

    标签: c# json fluent-nhibernate


    【解决方案1】:

    这只是一种预感,但您可能想调查一下它真正尝试序列化的类型 - nHibernate 在运行时为每个 POCO 生成代理(因此它可以执行诸如延迟加载外键实体之类的事情)。这可能就是您收到此错误的原因。

    尝试指定要序列化的确切类型,或者创建一个全新的对象进行序列化,用 nHibernate POCO 的属性填充其属性。

    编辑: 这似乎更可能是您问题的答案:

    http://www.west-wind.com/WebLog/posts/147218.aspx

    基本上,检查所有 POCO 是否有任何循环引用(例如,客户 POCO 具有订单 POCO 作为属性,而订单 POCO 具有客户列表作为属性)

    【讨论】:

    • 我实际上通读了stackoverflow.com/questions/286721/… 并得到了一些答案,但我无法使给定的解决方案发挥作用。
    • 这解决了我的问题,但打开了另一个问题。我会为此发布一个新问题。
    猜你喜欢
    • 2012-08-20
    • 2014-12-31
    • 2014-02-18
    • 2011-07-05
    • 2016-06-27
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多