Сериализация nHibernate-запроса в JSON - PullRequest
2 голосов
/ 17 ноября 2010

Исследуя 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, я получил ошибку!

Циклическая ссылкабыл обнаружен при сериализации объекта типа 'System.Reflection.RuntimeModule'.

Кажется, это делается, независимо от того, тяну ли я один объект или список объектов ... или что-нибудь еще в этом отношенииЯ даже пытался пометить мои классы как [Serializable] с тем же результатом.Это не происходит с точно такими же классами, использующими подход Microsoft Entity Framework только для кода.

Могу ли я не десериализовать 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(); } }

1 Ответ

2 голосов
/ 17 ноября 2010

Это всего лишь догадка, но вам может потребоваться выяснить, какой тип он действительно пытается сериализовать. NHibernate генерирует прокси для каждого POCO во время выполнения (поэтому он может выполнять такие вещи, как отложенная загрузка объектов внешнего ключа и т. Д.).Это может быть причиной того, почему вы получаете эту ошибку.

Попробуйте указать точный тип для сериализации или, возможно, создайте совершенно новый объект для сериализации, заполнив его свойства свойствами nHibernate POCO.

РЕДАКТИРОВАТЬ: Это выглядит гораздо болееответ на ваши проблемы:

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

В основном, проверьте все ваши POCO для любых циркулярных ссылок (например, POCO Клиента, у которого POCO Заказа является свойством, в то время как POCO Заказа имеет список Клиента как свойства)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...