Проект является веб-сервисом веб-API Asp.Net.
У меня есть иерархия типов, в которой мне нужно иметь возможность сериализации в Json и из нее, поэтому я взял код из этого SO: Как реализовать пользовательский JsonConverter в JSON.NET десериализовать Список объектов базового класса? и применить конвертер к базовому классу иерархии; что-то вроде этого (там псевдокод здесь, чтобы скрыть несоответствия):
[JsonConverter(typeof(TheConverter))]
public class BaseType{
///note the base of this type here is from the linked SO above
private class TheConverter : JsonCreationConverter<BaseType>{
protected override BaseType Create(Type objectType, JObject jObject){
Type actualType = GetTypeFromjObject(jObject); /*method elided*/
return (BaseType)Activator.CreateInstance(actualType);
}
}
}
public class RootType {
public BaseType BaseTypeMember { get; set; }
}
public class DerivedType : BaseType {
}
Итак, если я десериализую экземпляр RootType
, чей BaseTypeMember
был равен экземпляру DerivedType
, то он будет десериализован обратно в экземпляр этого типа.
Для записи эти объекты JSON содержат поле '$type'
, которое содержит имена виртуального типа (не полные имена типа .Net), поэтому я могу одновременно поддерживать типы в JSON, контролируя точно, какие типы могут быть сериализованы и десериализованы.
Теперь это отлично работает для десериализации значений из запроса; но у меня проблема с сериализацией. Если вы посмотрите на связанный SO и, действительно, обсуждение Json.Net, связанное с верхним ответом, вы увидите, что базовый код, который я использую, полностью ориентирован на десериализацию; с примерами его использования, показывающими ручное создание сериализатора. Реализация JsonConverter
, приведенная в таблицу этим JsonCreationConverter<T>
, просто вызывает a NotImplementedException
.
Теперь, из-за того, что веб-API использует один форматтер для запроса, мне нужно реализовать стандартную сериализацию в методе WriteObject
.
В этот момент я должен подчеркнуть, что перед тем, как приступить к этой части моего проекта, у меня было все сериализация без ошибок.
Итак, я сделал это:
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
Но я получаю JsonSerializationException
: Self referencing loop detected with type 'DerivedType'
, когда один из объектов сериализуется. Опять же - если я удалю атрибут конвертера (отключив мое собственное создание), тогда он отлично работает...
У меня такое ощущение, что это означает, что мой код сериализации фактически запускает конвертер снова на том же объекте, который, в свою очередь, снова вызывает сериализатор - ad nauseam. Подтверждено - см. мой ответ
Итак, какой код я должен писать в WriteObject
, который будет выполнять ту же "стандартную" сериализацию, которая работает?