"Обнаружен цикл саморегуляции" в Newtonsoft.Json

Для этого кода...

private void Label1_MouseUp(object sender, RoutedEventArgs e)
{
    Newtonsoft.Json.Linq.JObject.FromObject(e).ToString();
}

Я получаю эту ошибку...

Self referencing loop detected with type 'System.Windows.Documents.Run'. Path 'MouseDevice.Target.Inlines[0].SiblingInlines'.

Есть много других подобных вопросов, но я не могу понять, как реализовать решения в моем случае (я изучаю С#). Например, добавьте ReferenceLoopHandling = ReferenceLoopHandling.Ignore Но не могу определить, куда его поместить.

(Кстати, я пытаюсь найти простой универсальный способ распечатки отладочной информации.)

+1
20 июн. '14 в 18:51
источник поделиться
2 ответа

В вашем вопросе вы сказали, что не можете понять, куда положить ReferenceLoopHandling = ReferenceLoopHandling.Ignore. Вы можете поместить это в свой вызов в "FromObject" следующим образом:

JObject.FromObject(e, new JsonSerializer() {
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

Здесь ссылка на документацию JObject.FromObject: http://james.newtonking.com/json/help/index.html?topic=html/CreatingLINQtoJSON.htm

+1
24 июл. '14 в 17:23
источник

Да, это очень распространенная проблема, и в сообщении об ошибке говорится все.

Как вы догадываетесь, вы получили ссылку, которая уже была просеризована, что приводит к бесконечному действию в рекурсию для сериализации этого объекта. Если вы отметите его как Ignore ReferenceLoopHandling serilize будет продолжать работать и создаст вам StackoverflowException.

Вместо этого у вас мало решений, вот 2 из них:

  • Вы можете определить, какой из свойств вызывает этот цикл, и установить его на null если не нужно.
  • Вы можете создать другой класс для подготовки объекта serilize, заполнить его и выполнить сериализацию.
0
20 июн. '14 в 19:31
источник

Посмотрите другие вопросы по меткам или Задайте вопрос