Ради моих коллег из StackOverflowers, которые занимаются этим вопросом, я объясню, что я в итоге сделал:
В случае, который я описал, вы должны использовать стандартный сериализатор .NET (а не ServiceStack's): System.Web.Script.Serialization.JavaScriptSerializer
. Причина в том, что вы можете украсить свойства навигации, которые не нужно обрабатывать сериализатором, в атрибуте [ScriptIgnore]
.
Кстати, вы все еще можете использовать ServiceStack.JsonSerializer
для десериализации - это быстрее, чем .NET, и у вас нет проблем с StackOverflowException, о которых я задавал этот вопрос.
Другая проблема заключается в том, как заставить Само-отслеживающиеся объекты украшать соответствующие свойства навигации с помощью [ScriptIgnore]
.
Объяснение: Без [ScriptIgnore]
, сериализация (с использованием сериализатора .NET Javascript) также вызовет исключение, о циклическом
ссылки (аналогично проблеме, которая вызывает StackOverflowException в
ServiceStack). Нам нужно устранить округлость, и это сделано
используя [ScriptIgnore]
.
Поэтому я отредактировал файл .TT
, поставляемый с Шаблоном самоконтролируемого объекта ADO.NET , и установил в нем [ScriptIgnore]
в соответствующих местах (если кому-то понадобится код diff, напишите мне комментарий). Некоторые говорят, что редактировать эти «внешние», не предназначенные для редактирования файлы - плохая практика, но, черт возьми, это решает проблему, и это единственный способ, который не заставляет меня перестраивать всю мою архитектуру. приложение (используйте POCO вместо STE, используйте DTO для всего и т.д.)
@ mythz: Я не совсем согласен с вашим утверждением об использовании DTO - смотрите комментарии к вашему ответу. Я действительно ценю ваши огромные усилия по созданию ServiceStack (все модули!) И его бесплатному использованию с открытым исходным кодом. Я просто призываю вас либо уважать атрибут [ScriptIgnore] в ваших текстовых сериализаторах, либо придумать свой атрибут. Иначе, даже если на самом деле может использовать DTO, они не смогут добавить свойства навигации из дочернего объекта обратно в родительский, потому что они получат исключение StackOverflowException.
Я отмечаю ваш ответ как «принятый», потому что в конце концов он помог мне найти свой путь в этом вопросе.