2016-03-08 4 views
4

Моя модель класса выглядеть следующим образом:Обработка циклическая с Newtonsoft JSON

public class ModelType 
{ 
    public string Name { get; set; } 
    public ModelType SuperType { get; set } 
    public IEnumerable<ModelType> SubTypes { get; set; } 
} 

Я пытаюсь сериализации объекта, но получить StackOverflowException. Я пытался позвонить

JsonConvert.SerializeObject(model, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 

, а также

JsonConvert.SerializeObject(model, new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects }); 

Оба вызова привели к StackOverflowException. Любая идея, как сериализовать ModelType экземпляр?

РЕДАКТИРОВАТЬ:

Пример экземпляра, который не может сериализовать:

{ 
    Name: "Child", 
    SuperType: { 
     Name: "Parent", 
     SuperType: null, 
     SubTypes: [{ 
       Name: "Child", 
       SuperType: { 
        Name: "Parent", 
        SuperType: null, 
        SubTypes: [{Name: "Child", ...}] 
       }, 
       SubTypes: [] 
     }] 
    }, 
    SubTypes: [] 
} 

EDIT2:

Путем дальнейшего изучения вопроса (по всем SO Q & A , установка ReferenceLoopHandling.Ignore или PreserveReferencesHandling.Objects должна работать) Я выяснил, что

  1. ребенок уникален экземпляр объекта
  2. Child.SuperType (Родитель) является уникальным экземпляром объекта
  3. Child.SuperType.SubTypes [0] (ребенок) является экземпляром уникального объекта, не является ссылкой на (1.)
  4. Child.SuperType.SubTypes [0] .SuperType (Parent) является экземпляром уникального объекта, а не ссылка (2)
  5. И так далее ...

Я думаю, что-то пошло неправильно во время объекта c reation (из моего кода), и это создало бесконечную цепочку объектов. Я не уверен, что это возможно даже с JsonSerializerSettings.

+0

Добавлен пример населенного объекта. – mimo

+0

У вас есть полный C# -проигрыватель, который компилируется. –

+0

@Simon Mourier, извините, но не могу предоставить код, который компилируется, он слишком сложный (через сущность framework -> получение объектов данных -> передача бизнес-сущностям). Но я думаю, что нашел основную причину. Когда объект данных преобразуется в бизнес-объект, создается эта бесконечная цепочка, устанавливая свойства SuperType и SubTypes по запросу Lync, который оценивается «на ходу» при сериализации. – mimo

ответ

4

Newtonsoft.Json может иметь следующие конфигурации

JsonSerializerSettings sets = new JsonSerializerSettings 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects 
    }; 

    var ser = JsonSerializer.Create(sets); 

вы можете захотеть сделать это.

+0

Я пробовал, но он не работает для меня. По-прежнему получается 'StackOverflowException'. – mimo

+1

@mimo - Вы посмотрели? http://stackoverflow.com/questions/25853407/json-net-not-respecting-preservereferenceshandling-on-deserialization –

+0

Я рассмотрел вопрос и попытался использовать те же 'JsonSerializerSettings', что и в предлагаемом ответе, но он не работал для меня. Большинство решений заявляют, что 'PreserveReferencesHandling = PreserveReferencesHandling.Objects' должно обрабатывать дело, но оно не работает в моем случае. – mimo

Смежные вопросы