Domanda

sto avendo problemi con un riferimento circolare quando provo e serialise un oggetto restituito tramite EF4 CTP5. Im utilizzando il primo approccio codice e semplice poco di per il mio modello.

ho aggiunto [ScriptIgnore] attribuisce a tutte le proprietà che forniscono un riferimento indietro a un oggetto e fastidiosamente ogni sembra funzionare bene se ho un'istanza di manualmente del poco, cioè esse puntate a JSON bene, e l'attributo scriptignore è riconosciuto. Tuttavia quando provo e serialise un oggetto restituito dal DAL ottengo eccezione riferimento circolare "Un riferimento circolare rilevato durante la serializzazione di un oggetto di tipo 'System.Data.Entity.DynamicProxies.xxxx'"

Ho provato diversi modi di retreiving dati ma tutti rimanere bloccati con questo errore:

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

Il metodo seguente funziona leggermente meglio come piuttosto che l'oggetto proxy timeslot dinamico causando la refference circolare sua dell'oggetto appuntamento.

    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);
    }

Tutte le idee o soluzioni a questo problema?

Aggiorna Io preferirei usare l'out of the box serialiser, se possibile, anche se Json.Net tramite NuGet è ok come alternativa mi auguro il suo possibile utilizzarlo come ho inteso così ...

È stato utile?

Soluzione

Ho avuto un problema simile con IIS ospitato servizio WCF e cercando di serializzare gli oggetti con la classe POCO DataContractJsonSerializer. Il costruito nel JSON serializzatore non sembra per gestire i riferimenti circolari a tutti. Sono stato in grado di ottenere intorno ad esso gestendo la serializzazione me stesso utilizzando le Json.NET serializzatore, e proprio ritorno stringhe JSON dai miei metodi. Il serializzatore JSON.net ha un'opzione per ignorare i riferimenti circolari come JSON in sé non li supporta.

Altri suggerimenti

Non importa quello che ho fatto la dinamica deleghe tenute essere un punto critico, sono andato per quanto riguarda la rimozione di tutti i riferimenti circolari nel mio modello! ma ancora il problema persisteva.

ho provato Json.Net ma si è verificato lo stesso problema.

Alla fine ho inciampato su un post su come utilizzare una consuetudine JavaScriptConverter

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

implementato il codice e bob tuo zio tutto ha funzionato

Ho risolto questo senza dover ricorrere a un serializzatore JSON esterna. In un nutshull ho disabile ProxyCreation nel costruttore del mio contesto dell'oggetto.

Non sono sicuro perché questo funziona, ma ho postato un follow-up domanda qui.

ho usato il seguente ContractResolver. Si noti che ho ereditato dalla CamelCaseContractPropertyResolver per ottenere questa caratteristica pure, ma si può anche ereditare direttamente da 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);
        }
    }
}

Per usarlo, crea il tuo serializzatore e quindi impostare la proprietà ContractResolver ad una nuova istanza di questa classe:

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

ho incontrato questo problema anche. Le risposte a questa discussione contiene soluzioni numerici. Ma migliori soluzioni diverse per i diversi casi con spiegazione e per di più senza personalizzati serializza ho trovato nell'articolo di Linda Sole - la gestione del ciclo di riferimento in Web API .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top