문제

엔티티 프레임 워크 객체를 JavaScript 객체 (JSON)로 직렬화하려면 어떻게해야합니까? 나는 사용을 시도했다 json.net 그러나 직렬화하려고 할 때 다음과 같은 예외를 얻고 있습니다.

예외 : newtonsoft.json.jsonserializationException, message = "자체 참조 루프"

히테

도움이 되었습니까?

해결책

주기적 참조와 관련하여 원래 Datacontract Serializer와 동일한 일반적인 문제가있는 것 같습니다. 서로를 참조하는 객체는 메모리의 객체 그래프와 상당히 일반적이지만, 그러한 순환 참조는 직렬 라이저가 구체적으로 설명하지 않으면 직렬화 될 때 필연적으로 무한 재귀를 초래합니다. 일반적인 비 이진 직렬화 형식에서 주기적 참조를 다루기위한 확립 된 표준은 거의 없습니다 (XML과 JSON은 가장 널리 퍼져 있습니다.)

Microsoft는 XML에서 심판 시맨틱을 사용하여 .NET 3.5 SP1의 데이터 콘텐츠 세리어 라이저에 대한 주기적 문제를 해결했습니다. 내가 아는 한, JSON에게는 그러한 것이 없기 때문에 JSON.NET이 객체 그래프를 직렬화하는 것을 방해하는 이유 일 수 있습니다.

나는 당신이 당신의 객체 그래프에 두 가지 방법이 아니라 탐색 가능한 편도 인 참조 만 가지고 있는지 확인합니다 (즉, 부모에서 자녀가 아닌 부모로서 자녀가 아닌 부모 로서만 부모/자녀/부모/부모가 가장 일반적입니다. 주기적 참조의 유형. 하위 수준의 어린이가 궁극적으로 그래프의 근본을 참조하여 간접 주기적 그래프를 생성 할 수 있습니다 (그러나 부모/자식 루프보다 훨씬 덜 일반적입니다.)

객체 그래프에서 주기적 참조를 제거하면 직렬화 할 수 있어야합니다.

다른 팁

이 문제가 있었고 루프를 일으키는 속성에 newTonsoft.json.jsonIgnoreatTribute를 추가하여 해결했습니다. 분명히, 그 속성은 직렬화되지 않습니다. 이 문제를 돕기 위해 일반적으로 내 실체에 외국 참조 ID와 외국 클래스를 모두 갖추게됩니다. 나는 이것이 직관적이지 않다는 것을 알고 있지만 (또는 매우 위대한 OO) Julia Lerman이 그녀의 책 프로그래밍 엔티티 프레임 워크 : Code First에서 추천하는 방식입니다. 엔티티 프레임 워크의 몇 가지 문제를 부드럽게하는 데 도움이된다는 것을 알았습니다.

 public class SomeEntity
 {
      [JsonIgnore]
      public ForeignEntity SomeForeignEntity {get;set;}
      public Guid ForeignEntityId {get;set;}
 }

업데이트 : DBContext에서 프록시를 비활성화해야한다고 언급하는 것을 잊었습니다.

dataContext.Configuration.ProxyCreationEnabled = false;

서비스에 대한 코드를 작성하는 경우 (직렬화하는 경우에 보이는 경우) 문제가되지 않지만 프록시 생성이 비활성화 될 때 잃어버린 것들이 있습니다. 여기를 봐: http://www.sellsbrothers.com/posts/details/12665 자세한 사항은.

MS Web API를 사용하고 있으므로 컨트롤러를 구성 할 때 프록시 생성을 비활성화합니다.

public class MailingApiController : ApiController
{
    public MailingApiController()
    {
        PreventDeepSerialization();
    }

    private static void PreventDeepSerialization()
    {
        var dataContext = Injector.Get<IIntertwyneDbContext>();
        dataContext.Configuration.ProxyCreationEnabled = false;
    }
      ....

이 문제를 해결하기 위해 엔터티를 먼저 Poco 기반 코드로 변환했습니다. 이를 위해 EDMX 창을 마우스 오른쪽 버튼으로 클릭하고 다음을 선택하십시오.

코드 생성 항목> 코드 탭> EF POCO 엔티티 생성기 추가.

NUGET을 사용하지 않으면 설치해야 할 수도 있습니다.

그러나 런타임에 EF는 추적 목적으로 해당 객체에 프록시 클래스를 추가하지만 직렬화 프로세스를 엉망으로 만드는 경향이 있습니다. 이를 방지하기 위해 간단히 proxycreationEnabled를 다음과 같이 False로 설정할 수 있습니다.

var context = new YourEntities();
context.Configuration.ProxyCreationEnabled = false;

var results = context.YourEntity.Take(100).ToList();

그런 다음 다음과 같이 기본 참조 루핑을 생략하여 JSON.NET 직렬화 데이터를 안전하게 반환 할 수 있습니다.

return JsonConvert.SerializeObject(results, Formatting.Indented, 
    new jsonSerializerSettings { 
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
    });
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top