Limitações de serialização de XamlWriter.Save
A API Save pode ser usada para serializar o conteúdo de um aplicativo Windows Presentation Foundation (WPF) como um arquivo XAML (Extensible Application Markup Language). No entanto, existem algumas limitações importantes em exatamente o que é serializado. Essas limitações e algumas considerações gerais são documentadas neste tópico.
Representação de tempo de execução, não em tempo de design
A filosofia básica do que é serializado por uma chamada para Save é que o resultado será uma representação do objeto que está sendo serializado, em tempo de execução. Muitas propriedades de tempo de design do arquivo XAML original já podem ser otimizadas ou perdidas no momento em que o XAML é carregado como objetos na memória e não são preservadas quando você chama Save para serializar. O resultado serializado é uma representação efetiva da árvore lógica construída do aplicativo, mas não necessariamente do XAML original que o produziu. Esses problemas tornam extremamente difícil usar a Save serialização como parte de uma extensa superfície de design XAML.
A serialização é independente
A saída serializada de é autossuficiente, tudo o que é serializado está contido dentro de uma única página XAML, com um único elemento raiz e nenhuma referência externa além de Save URIs. Por exemplo, se sua página tiver referenciado recursos de recursos do aplicativo, eles aparecerão como se fossem um componente da página que está sendo serializada.
Referências de extensão são desreferenciadas
Referências comuns a objetos feitas por vários formatos de extensão de marcação, como StaticResource
ou Binding
, serão desreferenciadas pelo processo de serialização. Eles já estavam desreferenciados no momento em que os objetos na memória foram criados pelo tempo de execução do aplicativo, e a Save lógica não revisita o XAML original para restaurar essas referências à saída serializada. Isso potencialmente congela qualquer valor obtido de associação de dados ou recurso como sendo o valor usado pela última vez pela representação de tempo de execução, com capacidade apenas limitada ou indireta para distinguir esse valor de qualquer outro valor definido localmente. As imagens também são serializadas como referências de objeto a imagens como elas existem no projeto, em vez de como referências de origem originais, perdendo qualquer nome de arquivo ou URI que foi originalmente referenciado. Até mesmo recursos declarados na mesma página são vistos serializados no ponto em que foram referenciados, em vez de serem preservados como uma chave de uma coleção de recursos.
A manipulação de eventos não é preservada
Quando os manipuladores de eventos adicionados por meio de XAML são serializados, eles não são preservados. XAML sem code-behind (e também sem o mecanismo x:Code relacionado) não tem como serializar a lógica de procedimento de tempo de execução. Uma vez que a serialização é independente e limitada à árvore lógica, não há recurso para armazenar os manipuladores de eventos. Como resultado, os atributos do manipulador de eventos, o próprio atributo e o valor da cadeia de caracteres que nomeia o manipulador, são removidos do XAML de saída.
Cenários realistas para uso de XAMLWriter.Save
Embora as limitações listadas aqui sejam bastante substanciais, ainda há vários cenários apropriados para uso Save para serialização.
Saída vetorial ou gráfica: a saída da área de dados renderizados pode ser usada para reproduzir os mesmos vetores ou gráficos quando recarregada.
Documentos de fluxo e rich text: texto e toda a formação e confinamento de elementos dentro dele são preservados na saída. Isso pode ser útil para mecanismos que se aproximam de uma funcionalidade de área de transferência.
Preservando dados de objeto de negócios: se você tiver armazenado dados em elementos personalizados, como dados XML, desde que seus objetos de negócios sigam regras XAML básicas, como fornecer construtores personalizados e conversão para valores de propriedade por referência, esses objetos de negócios poderão ser perpetuados por meio da serialização.
.NET Desktop feedback