Nous avons eu exactement ce problème, qui a été résolu en s'inspirant de la réponse de Handcraftsman ici.
Le problème vient du fait que JSON.NET ne sait pas comment sérialiser les classes proxy de NHibernate. Solution : sérialiser les instances de proxy comme leur classe de base.
Une version simplifiée du code du bricoleur se présente comme suit :
public class NHibernateContractResolver : DefaultContractResolver {
protected override List<MemberInfo> GetSerializableMembers(Type objectType) {
if (typeof(INHibernateProxy).IsAssignableFrom(objectType)) {
return base.GetSerializableMembers(objectType.BaseType);
} else {
return base.GetSerializableMembers(objectType);
}
}
}
À mon avis, ce code présente l'avantage de continuer à s'appuyer sur le comportement par défaut de JSON.NET en ce qui concerne les attributs personnalisés, etc. (et le code est beaucoup plus court !).
Il est utilisé comme suit
var serializer = new JsonSerializer{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
ContractResolver = new NHibernateContractResolver()
};
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(stringWriter);
serializer.Serialize(jsonWriter, objectToSerialize);
string serializedObject = stringWriter.ToString();
Note : Ce code a été écrit pour et utilisé avec NHibernate 2.1. Comme certains commentateurs l'ont souligné, il ne fonctionne pas d'emblée avec les versions ultérieures de NHibernate, vous devrez procéder à quelques ajustements. J'essaierai de mettre à jour le code si jamais je dois le faire avec des versions ultérieures de NHibernate.
2 votes
Pouvez-vous nous donner des détails sur les erreurs que vous rencontrez ?
0 votes
J'obtenais le message "La méthode ou l'opération n'est pas implémentée" et le correctif de Liedman a fonctionné pour moi.