JSON.NET молча игнорирует циклические ссылки и устанавливает произвольные ссылки в цепочке на null для их разрешения.

Я пытаюсь сериализовать граф объектов в JSON.NET, в котором галактика содержит StarSystems, StarSystem содержит планеты, планета содержит колонию, колония имеет владельца, а в галактике также есть список империй, каждая из которых есть список исследованных StarSystems. Итак, существует круговая ссылка между StarSystem, Planet и Empire.

Чего я не понимаю, так это поведения, которое я получаю при сериализации графа объекта. Вместо того, чтобы выдавать ошибку, когда у меня установлена ​​обработка ссылочного цикла по умолчанию, и пытаться сериализовать все, когда у меня установлен режим сериализации, кажется, что сериализует несколько ссылок в цепочке, а затем отказывается и устанавливает произвольные значения (в моем случае исследованные звездные системы) равным нулю. Естественно, это вызывает сбои в другом месте приложения, когда оно ищет звездные системы, но находит только нули!

Может ли это иметь какое-то отношение к тому факту, что некоторые звенья в цепочке являются не прямыми ссылками, а коллекциями? Например. у империи есть не одна исследованная звездная система, а их список.

Итак, как я могу заставить JSON.NET сериализовать все? Нужно ли мне исключить циклические ссылки и просто передавать идентификаторы объектов вместо фактических ссылок на объекты в моей объектной модели? Я действительно не хочу делать это только для целей сериализации!


person ekolis    schedule 09.05.2013    source источник
comment
У тебя есть код?   -  person Matt Burland    schedule 10.05.2013
comment
JSON.NET не должен иметь проблем с сериализацией любого графа объекта (или его правильным восстановлением). Скорее всего, ваш код сломан (например, из-за неожиданных действий в установщиках свойств). Разместите код ..   -  person Morten Mertner    schedule 10.05.2013
comment
Не уверены, какой код будет полезен - код, когда я вызываю сериализатор? Что-то другое? (Если я не сохраню и не перезагружу игру, а просто буду работать в памяти, все будет в порядке.)   -  person ekolis    schedule 10.05.2013
comment
Если это полезно, вот код, в котором я сериализую и десериализую галактику: pastebin.com/ciAexjKJ   -  person ekolis    schedule 10.05.2013
comment
Кроме того, звездные системы не удалены полностью из графа объектов - они все еще существуют в галактике, но больше не упоминаются в списке исследованных систем империи.   -  person ekolis    schedule 10.05.2013


Ответы (2)


Я придумал обходной путь. Вместо того, чтобы каждая империя хранит список исследованных звездных систем, каждая звездная система будет хранить список империй, которые ее исследовали. Таким образом, никаких циклических ссылок!

person ekolis    schedule 10.05.2013

Не знаю, как я это сделал, но похоже, что теперь я просто добавляю null в список исследованных звездных систем, вместо того, чтобы заменять список исследованных звездных систем, поэтому я могу просто отфильтровать его. Извините, я понятия не имею, что я сделал, чтобы это исправить!

person ekolis    schedule 10.05.2013
comment
И теперь я снова получаю простые нули. Это совершенно случайно. - person ekolis; 10.05.2013
comment
На самом деле не случайно. Кажется, возникают проблемы, когда звездная система упоминается через $ ref из империи в JSON, а не содержится внутри империи. - person ekolis; 10.05.2013