Compartir a través de


Limitaciones de serialización de XamlWriter.Save

La API Save se puede usar para serializar el contenido de una aplicación de Windows Presentation Foundation (WPF) como un archivo xaml (Extensible Application Markup Language). Sin embargo, hay algunas limitaciones importantes en lo que se serializa exactamente. Estas limitaciones y algunas consideraciones generales se documentan en este tema.

Representación en tiempo de ejecución, no Design-Time

La filosofía básica de lo que se serializa mediante una llamada a Save es que el resultado será una representación del objeto que se serializa en tiempo de ejecución. Es posible que muchas propiedades en tiempo de diseño del archivo XAML original ya estén optimizadas o se pierdan para cuando el XAML se carga como objetos en memoria y no se conserven cuando se llama a Save para serializar. El resultado serializado es una representación efectiva del árbol lógico construido de la aplicación, pero no necesariamente del XAML original que lo generó. Estos problemas dificultan enormemente el uso de la Save serialización como parte de una amplia superficie de diseño XAML.

La serialización es Self-Contained

La salida serializada de Save es independiente; todo lo que se serializa se encuentra dentro de una sola página XAML, con un único elemento raíz y sin referencias externas que no sean URI. Por ejemplo, si tu página hace referencia a recursos de la aplicación, estos aparecerán como si fueran un componente de la página que se está serializando.

Las referencias de extensión se desreferencian

El proceso de serialización desreferenciará las referencias comunes a objetos realizados por varios formatos de extensión de marcado, como StaticResource o Binding. Ya se han desreferenciado en el momento en que durante la ejecución de la aplicación se crearon los objetos en memoria y la lógica de Save no revisita el XAML original para restaurar estas referencias en la salida serializada. Esto puede congelar cualquier valor vinculado a datos o obtenido de recursos, haciéndolo el valor más reciente utilizado por la representación en tiempo de ejecución, con una capacidad limitada o indirecta para diferenciar dicho valor de cualquier otro valor establecido localmente. Las imágenes también se serializan como referencias de objeto a imágenes tal como existen en el proyecto, en lugar de como referencias de origen originales, lo que pierde el nombre de archivo o el URI a los que se hace referencia originalmente. Incluso los recursos declarados en la misma página se ven serializados en el punto al que se hace referencia, en lugar de conservarse como clave de una colección de recursos.

El control de eventos no se conserva

Cuando los controladores de eventos que se agregan a través de XAML se serializan, no se conservan. XAML sin código subyacente (y sin el mecanismo x:Code relacionado) no tiene ninguna manera de serializar la lógica de procedimientos en tiempo de ejecución. Dado que la serialización es independiente y está limitada al árbol lógico, no hay ninguna instalación para almacenar los controladores de eventos. Como resultado, los atributos del controlador de eventos, tanto el propio atributo como el valor de cadena que nombra al controlador, se quitan del XAML de salida.

Escenarios realistas para el uso de XAMLWriter.Save

Aunque las limitaciones enumeradas aquí son bastante importantes, todavía hay varios escenarios adecuados para su uso Save para la serialización.

  • Salida gráfica o vectorial: la salida del área representada se puede usar para reproducir el mismo vector o gráfico cuando se vuelve a cargar.

  • Documentos de texto enriquecido y de flujo: el texto, todo el formato de elementos y la inclusión de elementos en ellos se conservan en la salida. Esto puede ser útil para mecanismos que simulan una funcionalidad de portapapeles.

  • Conservación de los datos de objetos de negocio: si has almacenado datos en elementos personalizados, como datos XML, siempre y cuando los objetos empresariales sigan reglas XAML básicas, como proporcionar constructores personalizados y conversión para valores de propiedad por referencia, estos objetos de negocio se pueden perpetuar a través de la serialización.