Estoy usando Ef 4.1 y tengo un POCO de objeto me gustaría serializar a JSON, he leído que hay un problema de hacerlo cuando se utiliza la carga diferida, pero no estoy seguro de que puedo porque un Message puede tener una colección de Message.

Hay alguna forma de hacer esto? sirialize este tipo de objeto en JSON?

Mi Message objeto se ve como:

public class Message
{
    [Key]
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public DateTime CreatedAt { get; set; }
    public DateTime? LastModified { get; set; }

    public virtual User User { get; set; }

    public virtual Message Parent { get; set; }

    public virtual ICollection<Message> Children { get; set; }
}
InformationsquelleAutor CD.. | 2011-08-29

4 Comentarios

  1. 2

    El problema es que las referencias circulares. Una manera fácil de evitar esto es usar Json.Net http://james.newtonking.com/projects/json-net.aspx en lugar de la predeterminada MVC json serializador. La última versión de Json.Net serializar objetos con referencias circulares fuera de la caja. http://james.newtonking.com/projects/json/help/PreserveObjectReferences.html para obtener más información sobre el problema

    • Gracias! ReferenceLoopHandling.Ignore y una costumbre ContractResolver hizo el truco 🙂
  2. 1

    Con ganas de carga usando Include(). Ejemplo de linq:

    var serializeMe = (from m in MyContext.Message.Include("User") where m.Id == someValue select m).ToList();

    Que dirá EF cargar la navegación de los usuarios de derecho de propiedad de distancia en lugar de la carga diferida, y el serializador no debe tener ningún problema con ella.

    • Incluyendo los relacionados con la entidad de resolver un problema que estaba teniendo serializar un EF objeto gráfico porque yo era capaz de tomar la palabra clave virtual de los infractores de la propiedad en mi clase. Gracias!
  3. 0

    Cómo sobre esto:

    • Marca de su clase como [Serializable]
    • Utilizar el JsonSerializer para serializar el objeto en JSON.
    • Quizás, utilizar con ganas de carga sobre las propiedades en su EF consulta?
    Message msg = new Message();
    var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(msg.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, msg);
    string json = Encoding.Default.GetString(ms.ToArray());
    
    
    [Serializable]
    public class Message
    {
    }
    • gracias por la detallada respuesta, pero me temo que las propiedades virtuales que no están cargados de esta manera…
    • lo que me estoy perdiendo? El virtual propiedad serializado bien para la recogida y el único propiedades: i.imgur.com/9mkW3.png
    • En EF virtuales ICollection se carga diferida..
  4. 0

    Bien, vamos a ir por partes.

    ¿Por qué está sucediendo esto?

    Porque tiene propiedades virtuales. Si usted está usando EF usted realmente necesita si usted está utilizando la carga Diferida. Usted puede configurar su EF no puede hacer esto por este ejemplo:

            context.Configuration.ProxyCreationEnabled = false;

    donde el contexto es su ObjectContext o DbContext… esto asumiendo que usted está utilizando EF. Pero para la mayoría de los casos este no es un buen planteamiento.

    Posible Solución

    Como siempre digo: «no hay buenas o malas soluciones, sólo diferentes maneras y depende del contexto», diciendo que, usted puede crear objetos dinámicos.

    En caso de que usted sólo tiene que serializar un objeto único, usted puede hacer algo como esto

            Json(new {@property1=yourObject.property1, @property2=yourObject.property2})

    En caso de tener una lista, bien, usted puede hacer esto:

            var list = new List<dynamic>();
    
            foreach(var item in myRepository.GetAll())
            {
                list.Add(new
                {
                    @property1= item.property1,
                    @property2= item.property2,
                    @property3= item.property3
                });
            }
            return Json(list, JsonRequestBehavior.DenyGet);

    He intentado hacer esto tan genérica como puedo. Espero que esto pueda ayudar a alguien!!

    Saludos y que tengan un muy buen día! 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here