Serializar Entity Framework Object utilizando Json.Net

asp.net-mvc entity-framework javascript json.net

Pregunta

¿Cómo serializo el objeto del marco de la entidad en el objeto JavaScript (JSON)? Intenté usar JSON.NET pero obtengo la siguiente excepción cuando trato de serializarlo.

Excepción: Newtonsoft.Json.JsonSerializationException, Message = "Bucle de referencia automática"

Hitesh

Respuesta aceptada

Parece que tiene el mismo problema general que el serializador de DataContract original, en lo que respecta a las referencias cíclicas. Si bien los objetos que se hacen referencia entre sí son bastante comunes con los gráficos de objetos en la memoria, tales referencias cíclicas inevitablemente producen recursiones infinitas cuando se serializan si el serializador no lo tiene en cuenta específicamente. Existen pocos estándares establecidos, si es que hay alguno, para tratar las referencias cíclicas en los formatos comunes de serialización no binarios (siendo los dos más prevalentes XML y JSON).

Microsoft resolvió el problema cíclico del serializador DataContract en .NET 3.5 SP1 haciendo uso de la semántica de ref en xml. Por lo que sé, no hay nada de eso para JSON, por lo que JSON.NET impide que serialice su gráfico de objetos.

Me aseguraría de que solo tenga referencias en su gráfico de objetos que sean navegables en un solo sentido, en lugar de ambas formas (es decir, solo de padres a hijos, no de niños a padres). Esos padres / niños y niños / padres son los más comunes Tipos de referencias cíclicas. También puede ser que un niño de nivel inferior finalmente haga referencia a la raíz del gráfico, lo que provoca que se cree un gráfico cíclico indirecto (estos tienden a ser mucho menos comunes que los bucles padre / hijo, sin embargo).

Una vez que elimines cualquier referencia cíclica en tu gráfico de objetos, deberías poder serializar.


Respuesta popular

Tuve este problema y lo resolví agregando el Newtonsoft.Json.JsonIgnoreAttribute a la propiedad que causa el bucle. Obviamente, esa propiedad no será serializada. Para ayudar con este problema, normalmente tendré tanto la ID de referencia extranjera como la clase extranjera en mis entidades. Me doy cuenta de que esto no es intuitivo (o OO super genial), pero es la forma recomendada por Julia Lerman en su libro Programming Entity Framework: Code First. He encontrado que ayuda a solucionar varios problemas con Entity Framework.

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

Actualización: olvidé mencionar que también necesitaba deshabilitar los proxies en DbContext así:

dataContext.Configuration.ProxyCreationEnabled = false;

Si está escribiendo el código para un servicio (lo que parece probable si está serializando), es probable que esto no sea un problema, pero hay algunas cosas que pierde cuando se deshabilita la creación del proxy. Consulte aquí: http://www.sellsbrothers.com/posts/Details/12665 para obtener más detalles.

Estoy usando MS Web Api, así que simplemente deshabilito la creación del proxy cuando construyo mi controlador:

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

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué