C# 将Nhibernate实体序列化为json序列化太多
我有一个问题,我已经试着解决一段时间了 情况如下 此人将在数据库中插入一个新实体 为了开始插入,我必须从xml文件进行代价高昂的转换,以填充一些基本属性 我想在之前处理这个xml,并将已经转换为o对象的对象存储在缺少缓存的地方C# 将Nhibernate实体序列化为json序列化太多,c#,.net,nhibernate,caching,serialization,C#,.net,Nhibernate,Caching,Serialization,我有一个问题,我已经试着解决一段时间了 情况如下 此人将在数据库中插入一个新实体 为了开始插入,我必须从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>();
}
}