Ответ 1
Чтобы сериализовать классы/структуры, необходимо сгенерировать сборки сериализации. Это может произойти в compiletime или во время выполнения. Sgen.exe используется для создания сборок сериализации в compiletime; Visual Studio может опционально автоматизировать этот процесс, как вы обнаружили.
- Выкл.. По умолчанию для конфигураций отладки (спасибо, @Alexandru Lache). Не создавайте сборки сериализации в compiletime. Сериализационные сборки будут генерироваться каждый раз, когда приложение запускается в соответствии с MSDN:
Когда генератор сериализатора XML не используется, XmlSerializer генерирует код сериализации и сборку сериализации для каждого типа каждый раз, когда приложение запускается. Чтобы повысить производительность запуска XML-сериализации, используйте инструмент Sgen.exe для создания этих сборок сборок заранее. Затем эти сборки могут быть развернуты вместе с приложением.
- Вкл: используйте Sgen.exe для создания сборки сериализации в compiletime. Это экономит время запуска, но увеличивает размер развертывания.
- Авто: настройки по умолчанию для выпуска. Официально создается только сборка, если в вашем коде используется
XmlSerializer
, за MSDN (спасибо, @L-Three). В моих тестах это не всегда срабатывало, поэтому я рекомендую явно установить его наOn
, если вы используетеXmlSerializer
.
Итак, мой ответ будет следующим: если вы беспокоитесь о времени запуска и используете атрибут Serializable
еще один раз, установите для параметра Вкл. Если вас больше беспокоит размер развертывания, измените его на Off. Я больше не оставляю его на Авто, потому что я ему не доверяю. Как я уже сказал, это похоже на Off, но я бы не рассчитывал на это.
Изменить: у меня определенно есть проблемы с различием между Off и Auto. Разница четко не определена нигде. Я бы включил On, если вы вообще используете атрибут Serializable, и Off, если вы этого не сделаете. Я бы не стал учитывать размер развертывания или время запуска. Кажется, я просто сталкиваюсь с меньшими ошибками, связанными с сериализацией, если я придерживаюсь этого правила.
Обновление:
После обзора упомянутых источников, я считаю, что "запуск" относится к первому, когда XmlSerializer
используется для любого заданного типа, а не для запуска первого приложения. Я не могу быть уверен; это немного неоднозначно.