serialize - referencia circular c#
json.net; serializar el objeto del marco de la entidad(error de referencia circular) (5)
Intente esto: Primero asegúrese de que poco o modelo tenga DataContract, DataMemeber y elimine la palabra clave virtual ... luego ...
public string Get()
{
var list = _languageRepository.GetMany(l => l.LanguageTrans.FirstOrDefault().CultureCode == "en").ToList();
string json = JsonConvert.SerializeObject(list, Formatting.Indented, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
return json;
}
Tengo una entidad marco de entidad que quiero serializar como un objeto json. Miré a mi alrededor y descubrí que json.net (http://james.newtonking.com/projects/json-net.aspx) debería ser capaz de serializar objetos con referencias circulares "de fábrica". Así que intenté usar
string json = JsonConvert.SerializeObject(/* my ef entity */);
Pero sigo recibiendo el mismo error. El problema podría ser que necesito usar ReferenceLoopHandling.Ignore
y un ContractResolver
, pero no estoy seguro de cómo usarlos. ¡Cualquier ayuda es muy apreciada! Gracias
Mi solución fue simplemente eliminar la referencia principal en las entidades de mi hijo.
Entonces, en mi modelo, seleccioné la relación y cambié la referencia principal para que sea interna en lugar de pública.
Puede que no sea una solución ideal para todos, pero funcionó para mí.
Otra solución será agregar el atributo [JsonIgnore]
a sus propiedades de navegación.
Por ejemplo:
using System;
using System.ComponentModel.DataAnnotations.Schema;
[Serializable]
public class Entity
{
public int EntityID { get; set; }
public string EntityName { get; set; }
[JsonIgnore]
public virtual Parent Parent { get; set; }
[JsonIgnore]
public virtual List<Child> Children { get; set; }
}
Para evitar esto, convertí mis entidades a Code First basado en POCO. Para hacer esto, haga clic derecho dentro de su ventana de edmx y seleccione:
Agregue el elemento de generación de código> pestaña Código> EF POCO Entity Generator.
Tenga en cuenta que puede necesitar instalarlo con Nuget si no lo ve.
En el tiempo de ejecución, sin embargo, EF agrega clases de proxy a esos objetos con fines de seguimiento, pero tienden a perder el tiempo con el proceso de serialización. Para evitar esto, simplemente podemos configurar ProxyCreationEnabled en falso de la siguiente manera:
var context = new YourEntities();
context.Configuration.ProxyCreationEnabled = false;
var results = context.YourEntity.Take(100).ToList();
A continuación, puede devolver de forma segura los datos serializados de JSON.NET omitiendo el bucle de referencia predeterminado de la siguiente manera:
return JsonConvert.SerializeObject(results, Formatting.Indented,
new JsonSerializerSettings {
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
Utilicé la siguiente solución para clonar mis entidades, sin trucos donde fuera necesario con respecto a los atributos de datos en las entidades y se conservaron las referencias circulares de mi tabla. Incluso tuve entidades señalando el uno al otro sin ningún problema. La biblioteca requerida para la serialización es Json.Net (Newtonsoft.Json dll).
private static T CloneObject<T>(T obj)
{
if (obj == null)
return obj;
string ser = JsonConvert.SerializeObject(obj, Formatting.Indented,
new JsonSerializerSettings() {
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore});
return (T) JsonConvert.DeserializeObject(ser, obj.GetType());
}
Ejemplo de uso:
protected object CopyObj(Object obj)
{
return CloneObject(obj);
}
var cust1 = this.cts.Customers().Where(cc => cc.Id == 3).Include(cc => cc.Addresses).FirstOrDefault();
var cust2 = CopyObj(cust1) as Customers;
//Cust2 now includes copies of the customer record and its addresses