Ограничения сериализации XamlWriter.Save
Save API можно использовать для сериализации содержимого приложения Windows Presentation Foundation (WPF) в виде расширяемого файла языка разметки приложений (XAML). Однако существуют некоторые важные ограничения в том, что сериализуется. Эти ограничения и некоторые общие рекомендации описаны в этом разделе.
Время выполнения, а не представление Design-Time
Основной принцип того, что сериализуется через вызов Save, заключается в том, что результат будет представлением объекта, который сериализуется, в процессе выполнения. Многие свойства разработки исходного XAML-файла уже могут быть оптимизированы или утеряны к моменту загрузки XAML в виде объектов в оперативной памяти, и не сохраняются при вызове метода Save для сериализации. Сериализованный результат — это эффективное представление созданного логического дерева приложения, но не обязательно исходного XAML, создающего его. Эти проблемы значительно затрудняют использование сериализации Save в рамках обширной XAML-поверхности дизайна.
Сериализация Self-Contained
Сериализованные выходные данные Save являются самодостаточными; все сериализованное содержится в одной странице XAML с одним корневым элементом и без внешних ссылок, кроме URI. Например, если страница ссылается на ресурсы из ресурсов приложения, они будут отображаться так, как если бы они были компонентом сериализации страницы.
Расширенные ссылки разыменовываются
Общие ссылки на объекты, созданные с помощью различных форматов расширения разметки, например StaticResource
или Binding
, будут разыменованы в процессе сериализации. Они уже были разыменованы в тот момент, когда объекты в памяти были созданы средой выполнения приложения, и логика Save не возвращается к исходному XAML для сохранения таких ссылок в сериализованных данных. Это потенциально заморозит любое исходящее или полученное ресурсом значение, которое является последним значением, используемым представлением во время выполнения, с ограниченной или косвенной возможностью отличить такое значение от любого другого набора значений локально. Изображения также сериализуются как ссылки на объекты изображений, существующих в проекте, а не как исходные ссылки, теряя любое имя файла или унифицированный идентификатор ресурса (URI). Даже ресурсы, объявленные на той же странице, сериализуются в точку, на которую они ссылались, а не сохраняются в качестве ключа коллекции ресурсов.
Обработка событий не сохраняется
Если обработчики событий, добавленные через XAML, сериализуются, они не сохраняются. XAML без программной части (а также без связанного механизма x:Code) не имеет способа сериализации процедурной логики среды выполнения. Так как сериализация является автономной и ограничена логическим деревом, нет средства для хранения обработчиков событий. В результате атрибуты обработчика событий, как сам атрибут, так и строковое значение, именующее обработчик, удаляются из выходного XAML.
Реалистичные сценарии использования XAMLWriter.Save
Хотя перечисленные здесь ограничения являются довольно существенными, существует еще несколько соответствующих сценариев использования Save для сериализации.
Вектор или графические выходные данные: выходные данные отрисованной области можно использовать для воспроизведения одного вектора или графики при перезагрузке.
Форматированный текст и документы потока: текст и все форматирование элементов и содержимое элементов внутри него сохраняются в выходных данных. Это может быть полезно для механизмов, которые приближают функциональные возможности буфера обмена.
Сохранение данных бизнес-объектов: если вы храните данные в пользовательских элементах, таких как XML-данные, до тех пор, пока бизнес-объекты следуют основным правилам XAML, таким как предоставление пользовательских конструкторов и преобразование для значений свойств по ссылке, эти бизнес-объекты можно увековечивать с помощью сериализации.
.NET Desktop feedback