将Nhibernate实体序列化为json序列化过多

时间:2012-08-25 21:13:31

标签: c# .net nhibernate caching serialization

我有一个问题,我已经尝试解决了一段时间。

方案如下

此人将在数据库中插入新实体。

要开始插入,我需要从xml文件进行代价高昂的转换以填充一些基本属性。

我想在之前处理这个xml,并将已经转换为o对象的对象存储在一些简短的缓存中。

之后,填充此对象的其他属性的过程非常耗时,我希望此人可以在中间停止并在之后返回结束。但是由于在插入此对象时在数据库中进行了一些验证,我无法将此对象保存在数据库中。

我已经整理过的解决方案涉及在人停止填充对象时序列化对象,即使它还没有完成,也就是当人回来继续填充时,我会反序列化对象以便人可以继续。

问题是,当我尝试序列化这个对象时,由于延迟加载,nihibernate几乎整个数据库序列化,并且我得到stackoverlow错误(大声笑,这很有趣,这里说这个错误大声笑)。

有谁知道我应该做什么?

我所做的一件事就是将对象保留在缓存中(不知道/ net 4缓存如何序列化它但接缝工作)然而每次我检索对象时它都会丢失一半的子对象,并且总是只有一半的孩子......

如果是现场我有一个包含20个项目的订单如果我试图从缓存中取回它将返回10个项目如果我再次尝试检索它我会得到订单只有5个itens。

有谁知道如何解决这个问题?

已经在那里尝试

NHibernate serializing lazy-loaded entities with WCF

Serialize nHibernate query to JSON

1 个答案:

答案 0 :(得分:1)

一种方法是首先预测您想要的内容,然后将结果序列化为DTO。

然而,通过这样做,您会遇到一个问题,即您正在创建具有大量setter / getter的DTO。创建一个简单的匿名类型并将其序列化不是更容易吗?我写了blog post来解释这一点。

//first create our anonymous type DTO
var dto = new { 
    Id = 0L, 
    Source = string.Empty, 
    Destination = string.Empty, 
    Is301 = false
};

//notice the ListAs(dto) extension method
var model = Session.QueryOver<CmsRedirect>()
  .SelectList(s => s
    .Select(x => x.Id).WithAlias(() => dto.Id)
    .Select(x => x.Source).WithAlias(() => dto.Source)
    .Select(x => x.Destination).WithAlias(() => dto.Destination)
    .Select(x => x.Do301).WithAlias(() => dto.Is301)
  )
  .Take(take).Skip(page * pageSize)
  .ListAs(dto);

return Json(new { Total = total, List = model }, 
    JsonRequestBehavior.AllowGet);

ListAs是一种简单的(ish)扩展方法。 (功劳归菲利普金斯基)

public static class NHibernateExtensions {
  public static IList<TRes> ListAs<TRes>(
      this IQueryOver qry, TRes resultByExample) {

    var ctor = typeof(TRes).GetConstructors().First();

    return qry.UnderlyingCriteria
      .SetResultTransformer(
        Transformers.AliasToBeanConstructor(
         (ConstructorInfo) ctor)
        ).List<TRes>();
  }
}

但是在我的示例中警告我不会将子集合序列化,因此您可能需要自己手动处理。