2011-10-23 2 views
1

Je voudrais sérialiser mon objet linq à json. L'objet linq est déconnecté, ce qui signifie que le datacontext a été éliminé il y a longtemps. Il existe des objets "liés" qui n'ont pas été chargés pendant le processus de chargement d'objets inaccessibles (Lorsque vous y accédez, l'erreur d'exécution renvoie "Impossible d'accéder à un objet éliminé".)Sérialiser .net linq object to json, exception sur datacontext

Y at-il des json/xml convertisseur avec la possibilité de sérialiser cet objet? Je ne veux pas modifier le dbml

Existe-t-il un objet de sérialisation avec la possibilité de configurer les propriétés d'exception d'ignorer ou non?

Pour reproduire ce problème, créez cet objet:

public class HelpMeToSerialize 
{ 
    public string Name; 
    public int Age 
    { 
     get 
     { 
      throw new Exception("Can't access this on runtime"); 
     } 
     set 
     { 
     } 
    } 

} 

Et simplement sérialiser avec ce code ou tout autre code que vous avez:

 HelpMeToSerialize obj = new HelpMeToSerialize(); 
     System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(obj.GetType()); 
     x.Serialize(Console.Out, obj); 
+0

Vous devez utiliser des ViewModels distincts. – SLaks

+0

Que voulez-vous dire? – Blokky

Répondre

0

DataContractSerializer pour XML et DataContractJsonSerializer pour JSON. Vous pouvez également essayer la bibliothèque NewtonSoft JSON.

+0

La bibliothèque DataContractJsonSerializer et NewtonSoft JSON a échoué. Le retour est System.ObjectDisposedException: Impossible d'accéder à un objet éliminé. Nom de l'objet: 'DataContext accessible après Dispose.' – Blokky

3

Si votre objet généré Linq a une relation à une autre table, que vous n'avez pas chargé au moment de la création de l'objet (via Linq2Sql par exemple), vous pouvez faire ce qui suit pour sérialiser:

//assume that your linq created object with class type StronglyTypedLinqObject has a field, ID, and a relationship called RelatedThing 

StronglyTypedLinqObject row_from_db = null; 

using(var myDatabase = new MyLinqContext(ConnectionString)) 
{ 
    myDatabase.DeferredLoadingEnabled = false; 

    //assume this pulls one item back which has a relationship 
    row_from_db = (from o in myDatabase.TheTableToSelectFrom select o).Single(); 
    row_from_db.RelatedThing = null; //this line may be unnecessary 
} // context is disposed now 
return Json(row_from_db); //this call should succeed 

Si vous désactivez le chargement différé et essayez de sérialiser, il n'essaiera pas de charger paresseux les objets associés.

Espérons que cela fonctionne.
Mustafa