Сначала вам нужно проверить, действительно ли это проблема. Если вы всегда заботитесь о книжном магазине, когда у вас есть книга, и вы всегда заботитесь обо всех книгах, которые есть в книжном магазине, то вполне разумно сериализовать весь график. Это не приводит к бесконечному циклу, потому что сериализация использует идентификатор, чтобы указать ссылку на объект, уже сериализованный (есть ошибка, если вы делаете сериализацию XML графа с циклической ссылкой в его types , но это проблема, а не присущая проблеме сериализации XML, о чем свидетельствует ее решение, см. Почему я получаю исключение "System.StackOverflowException ishandled" при сериализации? на что).
Так что, может быть, вы вообще не хотите здесь ничего делать, и вы в порядке, как и вы.
В противном случае вопрос - что вы хотите сериализовать? До сих пор большинство предложений заключалось в том, чтобы не сериализовать свойство TheShop
. Это может быть хорошо, или это может быть бесполезно, если вам понадобится позднее получить доступ к этому магазину.
Если у вас есть какой-то идентификатор (номер идентификатора, uri) для каждого магазина, то, возможно, вы могли бы вспомнить - доступ к TheShop
сначала проверяет, является ли приватный _theShop
нулевым, и, если это так, загружает соответствующий объект в _theShop
на основе этого идентификатора. Тогда вам просто нужно сериализовать идентификатор, а не полный объект.
Наконец, если вы используете XSLT для форматирования вывода в соответствии с какой-либо другой спецификацией (будь то XHTML для отображения или что-то еще), вам может оказаться проще просто свернуть собственную сериализацию XML. Хотя это во многих отношениях более сложная задача, тот факт, что XML, созданный сериализацией, не особенно удобен для переформатирования для отображения, может означать, что в целом это проще. Действительно, если это ваша единственная причина сериализации (вы никогда не десериализовываете из созданного XML), тогда это может быть намного проще, так как вам нужно только рассмотреть, что нужно для отображения для XML, и не беспокоиться ни о чем другом. Следовательно, сериализация может быть не лучшим подходом, а просто методом ToXml()
или WriteBookToXml()
в другом классе.