2012-08-25 4 views
0

문제가 있습니다. 이미 몇 시간 동안 해결하려고합니다. 데이터베이스에 새 개체의 삽입을 할 것입니다json에 Nhibernate 엔티티를 직렬화하면 너무 많이 직렬화됩니다.

사람을 다음과 같이

시나리오입니다.

일부 기본 속성을 채우기 위해 xml 파일에서 값 비싼 변환을 수행하려면 삽입을 시작해야합니다.

이전에이 xml을 처리하고 O 부족 객체로 변환 된 객체를 캐시에 저장하려고했습니다.

그 후,이 객체의 다른 속성을 채우는 과정은 매우 시간이 많이 걸리고 나는 그 사람이 중간에 멈추고 그 후에 끝내기를 원합니다. 그러나이 개체를 삽입 할 때 데이터베이스의 일부 유효성 검사로 인해 불완전한 데이터베이스에이 개체를 저장할 수 없습니다.

필자가 정돈 한 해결책은 사람이 그것을 채우지 못하게 할 때 해당 항목을 직렬화하는 것이고, 아직 완료되지 않은 경우에도 사람이 채우기를 계속하기 위해 돌아올 때보 다 객체를 deserialize하여 사람이 계속할 수 있도록하는 것입니다.

문제는 내가이 개체를 직렬화하려고하면 nihibernate는 게으른로드 때문에 거의 전체 데이터베이스를 직렬화하고 stackoverlow 오류가 발생합니다. (웃음은이 오류를 말하면 웃을 것입니다.)

누구에게 내가 무엇을해야하는지 알지 못합니까?

내가 한 일 중 하나는 캐시 개체를 유지하는 것입니다. (예 :/net 4 캐시가 직렬화하는 방법을 모르지만 작업 할 솔기가 있음) 그러나 개체를 검색 할 때마다 개체의 절반이 손실되므로, 항상 정확하게 아이들의 반 ....

살아있는 경우 나는 그것을 다시 검색하려고하면 캐시에서 다시 얻으려고하면 20 개 항목으로 주문을받습니다. 단 5 itens와 함께 주문있어.

누구든지 해결 방법을 알고 있습니까?

이미

NHibernate serializing lazy-loaded entities with WCF

Serialize nHibernate query to JSON

+0

안녕하세요 @ 가브리엘, 안녕하세요. * 문제가있는 곳 및/또는 * 예상 한 결과 *를 가리 키려는 코드의 관련 부분을 공유하십시오. – devundef

+0

Google 번역기를 사용 했습니까? 이것은 이해하기가 매우 어렵습니다 ... nhibernate에서 json으로 serialize하고 deserialize하고 중간 어딘가에 xml을 가지고 싶다는 것 외에는 정말로 원하는 것이 확실하지 않습니다. – devundef

+0

죄송합니다 얘들 아 난 이미 정보를 잘 이해하고 있기 때문에 ehat은 이해하기 쉽기를 바랍니다. –

답변

1

한 가지 방법은 당신이 다음 DTO에 결과에는 직렬화 먼저 무엇을 하시겠습니까? 프로젝트가 시도합니다.

그러나 이렇게하면 많은 세터/게터가있는 DTO를 만드는 문제가 발생합니다. 단순한 익명 형식을 만들어 대신 serialize하는 것이 더 쉽지 않습니까? 이에 대해 설명하는 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>(); 
    } 
} 

그러나 당신이 수동으로 자신이 처리해야 할 수 있습니다 그래서 아이들 모음에는 직렬화하지 않는 내 예에서 경고 (신용 필립 킨스키 (Kinsky)로 이동).

+0

문제는 자식 요소와 관련이 있으며 엔티티 자체가 거대하고 원본 객체를 변경하면 객체를 만들면됩니다. 너무 변경해야 할 것입니다. –

+0

AFAIK 이것은 NH Poco로 재귀 호출을 실행하여 이미 발견 한 유일한 방법입니다. – Rippo

+0

잘 모르겠지만 스택 오버플로는 양방향 one-to-many 관계로 인해 발생합니다. 클래스 수준에서 직렬화 할 항목을 표시 할 수 있습니까? – Rippo

관련 문제