gpt4 book ai didi

c# - 将 nHibernate 查询序列化为 JSON

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:59 25 4
gpt4 key购买 nike

在深入研究 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);
}
}

Lo,当我将查询从我的 nHibernate 上下文传递到 ToJson 方法时,我得到了一个错误!

A circular reference was detected while serializing an object of type '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();
}
}

最佳答案

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

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

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

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

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

关于c# - 将 nHibernate 查询序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4206925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com