Ограничения сериализации в XamlWriter.Save

API Save можно использовать для сериализации содержимого приложения Windows Presentation Foundation (WPF) в виде расширяемого файла языка разметки приложений (XAML). Однако существуют некоторые заметные ограничения в том, что именно подлежит сериализации. В данном разделе описаны эти ограничения и некоторые общие рекомендации.

Представление во время выполнения, а не во время разработки

Основной аспект определения того, что подлежит сериализации при вызове Save, заключается в том, что результатом будет представление сериализуемого объекта во время выполнения. Многие свойства времени разработки первоначального файла XAML могут быть оптимизированы или потеряны к тому времени, когда XAML загружается как объекты в памяти, и не сохраняются при вызове Save для сериализации. Результат сериализации — эффективное представление построенного логического дерева приложения, но не обязательно исходного XAML, который его создал. Эти проблемы существенно затрудняют использование сериализации Save как части обширной поверхности проектирования XAML.

Сериализация самодостаточна

Сериализованные выходные данные Save самодостаточны. Все, что сериализовано, содержится внутри единственной страницы XAML с единственным корневым элементом и без внешних ссылок, кроме URI. Например, если страницы ссылаются на ресурсы из ресурсов приложения, они будут отображаться, как если бы они были компонентом сериализуемой страницы.

Ссылки на расширения разыменовываются

Общие ссылки на объекты, сделанные различными форматами расширения разметки, такие как StaticResource или Binding, будут разыменованы в процессе сериализации. Они уже были разыменованы во время создания объектов в памяти при выполнении приложения, а логика Save не приводит к повторному посещению исходного XAML для восстановления таких ссылок для сериализованных выходных данных. Это потенциально замораживает любое значение, полученное из привязки данных или ресурсов, которое в последний раз использовалось представлением во время выполнения, и остается только ограниченная или косвенная возможность отличать такое значение от любого другого значения, установленного локально. Образы сериализуются как ссылки объектов на изображения в том виде, в котором они существуют в проекте, а не как исходные ссылки на источники, теряя изначально указанные ссылками имя файла или URI. Ресурсы, объявленные на одной странице, воспринимаются как сериализованные в том месте, где они были указаны ссылками, а не сохраняются как ключ коллекции ресурсов.

Обработка событий не сохраняется

Если обработчики событий, которые добавляются с помощью XAML, будут сериализованы, то они не сохранятся. XAML без кода программной части (и без связанного механизма x:Code) не имеет возможности сериализовать процедурную логику времени выполнения. Поскольку сериализация является самодостаточной и ограничивается логическим деревом, не существует средств для хранения обработчиков событий. В результате атрибуты обработчика событий (и атрибут, и строковое значение имени обработчика) удаляются из выходных данных XAML.

Реалистичные сценарии использования XAMLWriter.Save

Хотя ограничения, перечисленные здесь, являются достаточно значительными, существует несколько подходящих сценариев использования Save для сериализации.

  • Вывод векторных или графических данных. Вывод преобразованной для просмотра области можно использовать для воспроизведения того же вектора или графики при перезагрузке.

  • Форматированный текст и потоковые документы. Текст и все форматирование элементов и элементы внутри него сохраняются в выходных данных. Это может быть полезно для механизмов, которые аппроксимируют функциональность буфера обмена.

  • Сохранение данных бизнес-объекта. При сохранении данных в пользовательских элементах, например данных XML, при условии, что бизнес-объекты соответствуют базовым правилам XAML, таким как предоставление настраиваемых конструкторов и преобразование значений свойств по ссылке, эти бизнес-объекты могут быть сохранены посредством сериализации.