Проблема с DataContractResolver / KnownType, когда настраиваемый класс содержит другой настраиваемый класс

Я пытаюсь вывести список объектов в формате json с помощью класса DataContractJsonSerializer, однако продолжаю сталкиваться со следующей ошибкой.

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.

Я знаю, что на это уже был дан ответ, но это происходит только тогда, когда в моем объекте a имеют свойство, которое является другим настраиваемым объектом.

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

Как вы можете видеть, модель шутки содержит объект категории шутки, если я удалю категорию шутки и просто установлю int (JokeCategoryId), ошибка исчезнет, ​​хотя решение, а не идеальный вариант, поскольку я хотел бы, чтобы Категория была доступна без повторных запросов.

Ниже приведен код, который я использую для генерации 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
            };
        }
    }

Больше всего меня смущает то, что ошибка ссылается на Castle.Proxies.JokeCategoryProxy (откуда это взялось?!)

Есть предложения?

5
задан JConstantine 8 July 2011 в 11:09
поделиться