Вопрос

У меня проблемы с круговой ссылкой, когда я пробую сериал, возвращаемый объект, возвращаемый через EF4 CTP5. Я использую первый подход кода и простой Poco для моей модели.

Я добавил атрибуты [SCRIPTIGNORE] для любых свойств, которые предоставляют обратные ссылки на объект и раздражающе, кажется, все, кажется, работают нормально, если я вручную создал вручную, то есть их сериал к JSON Fine, а атрибут Scriptignore признан. Однако, когда я пытаюсь сеять объект, возвращаемый из DAL, я получаю круговое опорное исключение «круговая ссылка была обнаружена при сериализации объекта типа« System.data.entity.dynamicproxies.xxxx »

Я пробовал несколько способов решить данные, но все они застряли с этой ошибкой:

    public JsonResult GetTimeSlot(int id) {
        TimeSlotDao tsDao = new TimeSlotDao();
        TimeSlot ts = tsDao.GetById(id);
        return Json(ts);
    }

Метод ниже работает немного лучше, чем, а не динамический прокси от прокси от времени, вызывающий круговую референтность ее объект назначения.

    public JsonResult GetTimeSlot(int id) {
        TimeSlotDao tsDao = new TimeSlotDao();
            var ts = from t in tsDao.GetQueryable()
                 where t.Id == id
                 select new {t.Id, t.StartTime, t.Available, t.Appointment};
        return Json(ts);
    }

Любые идеи или решения этой проблемы?

Обновлять Я бы предпочел использовать из коробки Serialiser, если это возможно, хотя json.net через Nuget в порядке, в качестве альтернативы, я бы надеялся, что его возможно использовать, как я намереваю ...

Это было полезно?

Решение

У меня была похожая проблема с участием IIS Service WCF и пытается сериализовать объекты Poco с классом DataContractjsonserializer. Построенный в JSON Serializer, похоже, не обрабатывает круговые ссылки вообще. Я смог обойти это, обработал сериализацию себя, используя Json.net. Сериализатор и просто возвращая json строки из моих методов. Serializer JSON.NET имеет возможность игнорировать круговые ссылки, поскольку сама JSON не поддерживает их.

Другие советы

Независимо от того, что я сделал, что динамические прокси продолжали быть точкой прилипания, я пошел до удаления всех круговых ссылок в моей модели! Но все же проблема сохранилась.

Я попробовал json.net, но произошла та же проблема.

В конце я наткнулся на сообщение об использовании пользовательского JavaScriptConverter

http://hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-grened-classes/

Реализовал код и бобс твой дядя все сработало

Я решил это, не прибегая к внешнему серианизму JSON. В utshull я отключил ProxyCreation в конструкторе моего объекта контекста.

Я не уверен, почему это работает, но я разместил следующий вопрос здесь.

Я использовал следующий контрактеров. Обратите внимание, что я унаследовал от CamelCaseContractPropertyResolver, чтобы также получить эту функцию, но вы также можете наследовать непосредственно от defaultcontractresolver.

using System;
using System.Collections.Generic;
using System.Reflection;
using Newtonsoft.Json.Serialization;

namespace MyNamespace
{
    /// <summary>
    /// This class enables EntityFramework POCO objects to be serialized. In some cases POCO
    /// objects are subclassed by a proxy which has an additional member _entityWrapper. This
    /// object prevents serialization (circular references and references to non-serializable types).
    /// This removes the _entityWrapper from the list of members to be serialized.
    /// </summary>
    public class ContractResolver : CamelCasePropertyNamesContractResolver
    {
        protected override List<MemberInfo> GetSerializableMembers(Type objectType)
        {
            if (objectType.FullName.StartsWith("System.Data.Entity.DynamicProxies."))
            {
                var members = base.GetSerializableMembers(objectType);
                members.RemoveAll(memberInfo => memberInfo.Name == "_entityWrapper");
                return members;
            }
            return base.GetSerializableMembers(objectType);
        }
    }
}

Чтобы использовать его, создайте свой сериализатор, а затем установите свойство Contracteresolver для нового экземпляра этого класса:

var ser = JsonSerializer.Create(sJsonSerializerSettings);            
ser.ContractResolver = new ContractResolver(); 

Я тоже встретил эту проблему. Ответы на эту тему состоит из номеров решений. Но лучшие разные решения для разных случаев с объяснением и того, как без пользовательских сериализации я нашел в статье Hongye Sun. - Обработка эталона цикла в веб-API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top