Compartir a través de


Serialización y almacenamiento de documentos

Microsoft .NET Framework proporciona un entorno eficaz para crear y mostrar documentos de alta calidad. Características mejoradas que admiten documentos fijos y documentos de flujo, controles de visualización avanzados, combinados con funcionalidades gráficas 2D y 3D eficaces, toman aplicaciones de .NET Framework a un nuevo nivel de calidad y experiencia del usuario. La capacidad de administrar de forma flexible una representación en memoria de un documento es una característica clave de .NET Framework y poder guardar y cargar documentos de forma eficaz desde un almacén de datos es una necesidad de casi todas las aplicaciones. El proceso de conversión de un documento de una representación interna en memoria a un almacén de datos externo se denomina serialización. El proceso inverso de leer un almacén de datos y volver a crear la instancia original en memoria se denomina deserialización.

Acerca de la serialización de documentos

Idealmente, el proceso de serialización y deserialización de un documento desde y luego nuevamente en la memoria es transparente para la aplicación. La aplicación llama a un método "write" de serializador para guardar el documento, mientras que un método de deserializador "read" accede al almacén de datos y vuelve a crear la instancia original en la memoria. El formato específico en el que se almacenan los datos no suele ser un problema de la aplicación, siempre y cuando el proceso de serialización y deserialización vuelva a crear el documento en su forma original.

Las aplicaciones a menudo proporcionan varias opciones de serialización que permiten al usuario guardar documentos en un medio diferente o a un formato diferente. Por ejemplo, una aplicación podría ofrecer opciones de "Guardar como" para almacenar un documento en un archivo de disco, una base de datos o un servicio web. Del mismo modo, diferentes serializadores podrían almacenar el documento en diferentes formatos, como en HTML, RTF, XML, XPS o, alternativamente, en un formato de terceros. En la aplicación, la serialización define una interfaz que aísla los detalles del medio de almacenamiento dentro de la implementación de cada serializador específico. Además de las ventajas de encapsular los detalles de almacenamiento, las API de .NET Framework System.Windows.Documents.Serialization proporcionan otras características importantes.

Características de serializadores de documentos de .NET Framework 3.0

  • El acceso directo a los objetos de documento de alto nivel (árbol lógico y objetos visuales) permite un almacenamiento eficaz de contenido paginado, elementos 2D/3D, imágenes, medios, hipervínculos, anotaciones y otro contenido de soporte técnico.

  • Operación sincrónica y asincrónica.

  • Compatibilidad con serializadores de complementos con funcionalidades mejoradas:

    • Acceso para todo el sistema para que lo usen todas las aplicaciones de .NET Framework.

    • Detectabilidad sencilla del complemento de aplicaciones.

    • Implementación, instalación y actualización sencillas para complementos de terceros personalizados.

    • Soporte de interfaz de usuario para configuraciones y opciones personalizadas en tiempo de ejecución.

Ruta de impresión de XPS

La ruta de impresión XPS de Microsoft .NET Framework también proporciona un mecanismo extensible para escribir documentos a través de la salida de impresión. XPS actúa como formato de archivo de documento y es el formato nativo de cola de impresión para Windows Vista. Los documentos XPS se pueden enviar directamente a impresoras compatibles con XPS sin necesidad de conversión a un formato intermedio. Consulte Información general sobre la impresión para obtener información adicional sobre las opciones y funcionalidades de salida de la ruta de impresión.

Serializadores de complementos

Las System.Windows.Documents.Serialization APIs proporcionan soporte para tanto los serializadores de complementos como los serializadores vinculados, que se instalan por separado de la aplicación, se enlazan en tiempo de ejecución y se acceden mediante el SerializerProvider mecanismo de detección. Los serializadores de complementos ofrecen ventajas mejoradas para facilitar la implementación y el uso en todo el sistema. Los serializadores vinculados también se pueden implementar para entornos de confianza parciales, como aplicaciones de explorador XAML (XBAPs) donde no se puede acceder a los serializadores de complementos. Los serializadores vinculados, que se basan en una implementación derivada de la SerializerWriter clase, se compilan y vinculan directamente a la aplicación. Tanto los serializadores de complementos como los serializadores vinculados funcionan a través de métodos y eventos públicos idénticos que facilitan el uso de ambos tipos de serializadores en la misma aplicación.

Los serializadores de complementos ayudan a los desarrolladores de aplicaciones al proporcionar extensibilidad a los nuevos diseños de almacenamiento y formatos de archivo sin tener que codificar directamente para cada formato potencial en tiempo de compilación. Los serializadores de complementos también benefician a los desarrolladores de terceros proporcionando un medio estandarizado para implementar, instalar y actualizar complementos accesibles del sistema para formatos de archivo personalizados o propietarios.

Uso de un serializador de complemento

Los serializadores de complementos son fáciles de usar. La SerializerProvider clase enumera un SerializerDescriptor objeto para cada complemento instalado en el sistema. La IsLoadable propiedad filtra los complementos instalados en función de la configuración actual y comprueba que la aplicación puede cargar y usar el serializador. SerializerDescriptor también proporciona otras propiedades, como DisplayName y DefaultFileExtension, que la aplicación puede usar para pedir al usuario que seleccione un serializador para un formato de salida disponible. Se proporciona un serializador de plugin predeterminado para XPS con el .NET Framework y se enumera siempre. Una vez que el usuario selecciona un formato de salida, el CreateSerializerWriter método se usa para crear un SerializerWriter para el formato específico. Se puede llamar al método SerializerWriter.Write a continuación para enviar la secuencia de documentos al almacén de datos.

En el ejemplo siguiente se muestra una aplicación que usa el SerializerProvider método en una propiedad "PlugInFileFilter". PlugInFileFilter enumera los complementos instalados y crea una cadena de filtro con las opciones de archivo disponibles para .SaveFileDialog

// ------------------------ PlugInFileFilter --------------------------
/// <summary>
///   Gets a filter string for installed plug-in serializers.</summary>
/// <remark>
///   PlugInFileFilter is used to set the SaveFileDialog or
///   OpenFileDialog "Filter" property when saving or opening files
///   using plug-in serializers.</remark>
private string PlugInFileFilter
{
    get
    {   // Create a SerializerProvider for accessing plug-in serializers.
        SerializerProvider serializerProvider = new SerializerProvider();
        string filter = "";

        // For each loadable serializer, add its display
        // name and extension to the filter string.
        foreach (SerializerDescriptor serializerDescriptor in
            serializerProvider.InstalledSerializers)
        {
            if (serializerDescriptor.IsLoadable)
            {
                // After the first, separate entries with a "|".
                if (filter.Length > 0)   filter += "|";

                // Add an entry with the plug-in name and extension.
                filter += serializerDescriptor.DisplayName + " (*" +
                    serializerDescriptor.DefaultFileExtension + ")|*" +
                    serializerDescriptor.DefaultFileExtension;
            }
        }

        // Return the filter string of installed plug-in serializers.
        return filter;
    }
}

Una vez seleccionado un nombre de archivo de salida por el usuario, en el ejemplo siguiente se muestra el CreateSerializerWriter uso del método para almacenar un documento determinado en un formato especificado.

// Create a SerializerProvider for accessing plug-in serializers.
SerializerProvider serializerProvider = new SerializerProvider();

// Locate the serializer that matches the fileName extension.
SerializerDescriptor selectedPlugIn = null;
foreach ( SerializerDescriptor serializerDescriptor in
                serializerProvider.InstalledSerializers )
{
    if ( serializerDescriptor.IsLoadable &&
         fileName.EndsWith(serializerDescriptor.DefaultFileExtension) )
    {   // The plug-in serializer and fileName extensions match.
        selectedPlugIn = serializerDescriptor;
        break; // foreach
    }
}

// If a match for a plug-in serializer was found,
// use it to output and store the document.
if (selectedPlugIn != null)
{
    Stream package = File.Create(fileName);
    SerializerWriter serializerWriter =
        serializerProvider.CreateSerializerWriter(selectedPlugIn,
                                                  package);
    IDocumentPaginatorSource idoc =
        flowDocument as IDocumentPaginatorSource;
    serializerWriter.Write(idoc.DocumentPaginator, null);
    package.Close();
    return true;
}

Instalación de serializadores de complementos

La SerializerProvider clase proporciona la interfaz de aplicación de nivel superior para la detección y el acceso del serializador del complemento. SerializerProvider busca y proporciona a la aplicación una lista de los serializadores que están instalados y accesibles en el sistema. Los detalles de los serializadores instalados se definen mediante la configuración del Registro. Los serializadores de complementos se pueden agregar al Registro mediante el RegisterSerializer método ; o si .NET Framework aún no está instalado, el script de instalación del complemento puede establecer directamente los valores del Registro. El UnregisterSerializer método se puede usar para quitar un complemento instalado previamente o un script de desinstalación puede restablecer la configuración del Registro de forma similar.

Creación de un serializador de complemento

Tanto los serializadores de complementos como los serializadores vinculados usan los mismos métodos y eventos públicos expuestos, y de forma similar se pueden diseñar para operar de forma sincrónica o asincrónica. Normalmente se siguen tres pasos básicos para crear un serializador de complemento:

  1. Implemente y depure primero el serializador como serializador enlazado. Inicialmente, la creación del serializador compilado y vinculado directamente en una aplicación de prueba proporciona acceso completo a los puntos de interrupción y a otros servicios de depuración útiles para las pruebas.

  2. Después de probar completamente el serializador, se agrega una ISerializerFactory interfaz para crear un complemento. La ISerializerFactory interfaz permite el acceso total a todos los objetos de .NET Framework, que incluye el árbol lógico, UIElement los objetos, IDocumentPaginatorSourcey Visual los elementos . Además ISerializerFactory , proporciona los mismos métodos y eventos sincrónicos y asincrónicos que usan los serializadores vinculados. Desde que los documentos de gran tamaño pueden tardar tiempo en producirse, se recomienda el uso de operaciones asincrónicas para mantener una interacción ágil con el usuario y ofrecer una opción de "Cancelar" si se produce algún problema con el almacén de datos.

  3. Después de crear el serializador del complemento, se implementa un script de instalación para distribuir e instalar (y desinstalar) el complemento (vea más arriba, "Instalación de serializadores de complementos").

Consulte también