Estoy tratando de generar una lista de objetos a un formato json utilizando la clase DataContractJsonSerializer, pero sigo corriendo el siguiente error.Problema DataContractResolver/KnownType cuando la clase personalizada contiene otra clase personalizada
Type 'Castle.Proxies.JokeCategoryProxy' with data contract name
'JokeCategoryProxy:http://schemas.datacontract.org/2004/07/Castle.Proxies'
is not expected. Consider using a DataContractResolver or add any types not
known statically to the list of known types - for example, by using the
KnownTypeAttribute attribute or by adding them to the list of known
types passed to DataContractSerializer.
Sé que esto ha sido respondida antes, pero sólo parece ocurrir cuando un objeto en mi tener una propiedad que es otro objeto personalizado.
[DataContract]
[KnownType(typeof(ModelBase<int>))]
public class Joke : ModelBase<int>
{
[DataMember]
public virtual string JokeText { get; set; }
[DataMember]
public virtual JokeCategory JokeCategory { get; set; }
}
[DataContract]
[KnownType(typeof(ModelBase<int>))]
public class JokeCategory : ModelBase<int>
{
[DataMember]
public virtual string Name { get; set; }
}
Como se puede ver el modelo Broma contiene un objeto Broma Categoría, si quito la Categoría Broma y simplemente tienen un int (JokeCategoryId) desaparece el error, aunque una solución, no un ideal como me gustaría tener la Categoría disponible sin tener que consultar de nuevo.
A continuación se muestra el código que estoy usando para generar el JSON
public static ContentResult JsonResponse<TReturnType>(this Controller controller, TReturnType data)
{
using (var oStream = new System.IO.MemoryStream())
{
new DataContractJsonSerializer(typeof(TReturnType)).WriteObject(oStream, data);
return new ContentResult
{
ContentType = "application/json",
Content = Encoding.UTF8.GetString(oStream.ToArray()),
ContentEncoding = Encoding.UTF8
};
}
}
Lo que me confunde es el más referencias que el error Castle.Proxies.JokeCategoryProxy (donde ha salido esto ?!)
¿Alguna sugerencia?
Muy útil sJhonny cosas. Por el momento no entraré en DTOs, pero los tendré en cuenta para futuros desarrollos. Utilizar .Not.LazyLoad() en mi archivo de mapeo nhibernate fluido funcionó perfectamente para resolver el problema inmediato. Muchas gracias. – JConstantine