Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将Nhibernate实体序列化为json序列化太多_C#_.net_Nhibernate_Caching_Serialization - Fatal编程技术网

C# 将Nhibernate实体序列化为json序列化太多

C# 将Nhibernate实体序列化为json序列化太多,c#,.net,nhibernate,caching,serialization,C#,.net,Nhibernate,Caching,Serialization,我有一个问题,我已经试着解决一段时间了 情况如下 此人将在数据库中插入一个新实体 为了开始插入,我必须从xml文件进行代价高昂的转换,以填充一些基本属性 我想在之前处理这个xml,并将已经转换为o对象的对象存储在缺少缓存的地方 之后,填充这个对象的其他属性的过程是非常耗时的,并且我希望该人可以在中途停止,然后返回到结束。但是,由于插入此对象时在数据库中进行了一些验证,因此我无法将此对象保存在数据库中 我整理过的解决方案涉及到当用户停止填充对象时序列化对象,即使还没有完成,而当用户返回继续填充时,

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

情况如下

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

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

我想在之前处理这个xml,并将已经转换为o对象的对象存储在缺少缓存的地方

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

我整理过的解决方案涉及到当用户停止填充对象时序列化对象,即使还没有完成,而当用户返回继续填充时,我将反序列化对象,以便用户可以继续

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

有人知道我该怎么做吗

我所做的一件事是将对象保留在缓存中(不知道/net 4缓存如何序列化它,但它可以正常工作),但是每次我检索对象时,它会丢失一半的子对象,并且总是正好一半的子对象

如果是活的,我有一个20个项目的订单,如果我尝试从缓存中取回它,它将返回10个项目,如果我再次尝试检索它,我将只获得5个iten的订单

有人知道如何解决这个问题吗

已经在那里试过了


一种方法是先投影所需内容,然后将结果序列化为DTO

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

//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);
//首先创建匿名类型DTO
var dto=new{
Id=0升,
Source=string.Empty,
Destination=string.Empty,
Is301=false
};
//请注意ListAs(dto)扩展方法
var model=Session.QueryOver()
.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(页面*页面大小)
.ListAs(dto);
返回Json(新的{Total=Total,List=model},
JsonRequestBehavior.AllowGet);
ListAs是一种简单的(ish)扩展方法。(归功于菲利普·金斯克)

公共静态类NHibernateExtensions{
公共静态IList列表(
此IQueryOver qry,TRes result(例如){
var ctor=typeof(TRes).GetConstructors().First();
返回qry.underyingcriteria
.SETRESULT变压器(
Transformers.AliasToBean构造函数(
(ConstructorInfo)ctor
).List();
}
}

但请注意,在我的示例中,我不会序列化儿童收藏,因此您可能需要自己手动处理。

Hi@Gabriel,欢迎使用so。分享你代码的相关部分,试图指出问题所在和/或你期望的结果。你使用谷歌翻译吗?这很难理解。。。不确定您真正想要什么,除了您想要序列化和反序列化从nhibernate到json的内容,并且中间有一个xml。。。请尝试澄清。抱歉,伙计们,我已经正确地解释了信息,所以我希望更容易理解问题所在。问题在于子元素,实体本身是巨大的,如果我创建一个dto对象,如果我更改原始对象,我将不得不将其更改为AFAIK,这是唯一的方法,正如您通过使用NH Poco运行递归调用。我不确定,但我打赌堆栈溢出是由双向一对多关系引起的。你不能在类级别上标记你想要序列化的内容吗?我开始尝试这个,但我说的是一个订单,它有300个属性,比其他实体或实体集合的属性多100个,我不知道这是否可行,但我会尝试在这种情况下,我会将模型展平为两个db视图,一个用于实体,一个用于子对象,并映射这些对象,而不存在任何关系。然后简单地将两者序列化。如果模式改变,您将不得不在两个地方更改代码,但这是您必须接受的。
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>();
  }
}