Almacenamiento y serialización de documentos

Actualización: noviembre 2007

Microsoft .NET Framework proporciona un entorno eficaz para crear y mostrar documentos de gran calidad. Las características mejoradas que admiten tanto documentos fijos como dinámicos y controles de vista avanzados, todo ello combinado con eficaces funciones gráficas 2D y 3D aportan a las aplicaciones .NET Framework un nuevo nivel de calidad y experiencia del usuario. La posibilidad de administrar con flexibilidad una representación en memoria de un documento es una característica clave de .NET Framework. Por su parte, la capacidad de guardar y cargar con eficacia documentos de un almacén de datos es algo imprescindible en casi todas las aplicaciones. El proceso de convertir un documento de una representación en memoria interna en 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 en memoria original se denomina deserialización.

Este tema contiene las secciones siguientes.

  • Serialización de documentos
  • Serializadores de complemento
  • Temas relacionados

Serialización de documentos

En una situación ideal, el proceso de serializar un documento a partir de su representación en memoria y de deserializarlo para volver a crear una instancia de él en memoria resulta transparente a la aplicación. La aplicación llama a un método serializador de "escritura" para guardar el documento, mientras que un método deserializador de "lectura" obtiene acceso al almacén de datos y vuelve a crear la instancia original en memoria. Normalmente, la aplicación no tiene que ocuparse del formato concreto en el que se almacenan los datos, siempre que el proceso de serialización y deserialización vuelva a crear el documento en su forma original.

Con frecuencia, las aplicaciones proporcionan varias opciones de serialización que permiten al usuario guardar documentos en un soporte diferente o con un formato diferente. Por ejemplo, una aplicación podría ofrecer a opciones de "Guardar como" para almacenar un documento en un archivo de disco, una base de datos o un servicio web. De igual modo, diferentes serializadores podrían almacenar el documento en diversos formatos, tales como HTML, RTF, XML, XP o, como alternativa, en un formato de otro fabricante. Para la aplicación, la serialización define una interfaz que aísla los detalles del soporte de almacenamiento dentro de la implementación de cada serializador concreto. Además de las ventajas de encapsular los detalles del almacenamiento, las API.NET FrameworkSystem.Windows.Documents.Serialization proporcionan otras características importantes.

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

  • El acceso directo a los objetos de documento de alto nivel (árbol lógico y visual) permite el almacenamiento eficaz de contenido paginado, elementos 2D y 3D, imágenes, multimedia, hipervínculos, anotaciones y otro contenido de compatibilidad.

  • Funcionamiento sincrónico y asincrónico.

  • Compatibilidad con los serializadores de complemento con funciones mejoradas:

    • Acceso en todo el sistema para su uso por parte de todas las aplicaciones .NET Framework.

    • Sencilla capacidad de detectar complementos de aplicaciones.

    • Implementación, instalación y actualización sencillas de complementos personalizados de otros fabricantes.

    • Compatibilidad de la interfaz de usuario con la configuración y las opciones personalizadas en tiempo de ejecución.

Ruta de acceso de impresión de XPS

La ruta de acceso de impresión de XPS de Microsoft .NET Framework proporciona, además, un mecanismo extensible para la escritura de documentos incluida su salida impresa. XPS actúa como formato de archivo de documento y, a la vez, es el formato nativo de cola de impresión para Windows Vista. Los documentos XPS se pueden enviar directamente a las impresoras compatibles con XPS-sin que sea necesario pasarlos a un formato intermedio. Consulte Información general sobre impresión para obtener información adicional sobre las opciones y funciones de salida de la ruta de acceso de impresión.

Serializadores de complemento

Las API System.Windows.Documents.Serialization proporcionan compatibilidad con serializadores de complemento y serializadores vinculados que se instalan por separado con respecto a la aplicación, se enlazan en tiempo de ejecución y permiten el acceso mediante el mecanismo de detección SerializerProvider. Los serializadores de complemento proporcionan ventajas mejoradas de facilidad de implementación y uso en todo el sistema. Los serializadores vinculados también se pueden implementar para los entornos de confianza parcial tales como Aplicaciones del explorador XAML (XBAPs), donde no es posible tener acceso a los serializadores de complemento. Los serializadores vinculados, que se basan en una implementación derivada de la clase SerializerWriter, se compilan y vinculan directamente en la aplicación. Tanto los serializadores de complemento como los vinculados funcionan a través de métodos y eventos públicos idénticos, lo que facilita el uso de uno o ambos tipos de serializadores en la misma aplicación.

Los serializadores de complemento ayudan a los programadores de aplicaciones proporcionando extensibilidad a los nuevos diseños de almacenamiento y formatos de archivo sin tener que codificar directamente cada formato potencial en tiempo de compilación. Los serializadores de complemento también benefician a los programadores de otros fabricantes, al constituir un medio normalizado para implementar, instalar y actualizar complementos accesibles por el sistema para los formatos de archivo personalizados o de propietario.

Utilizar un serializador de complemento

Los serializadores de complemento son de uso sencillo. La clase SerializerProvider enumera un objeto SerializerDescriptor para cada complemento instalado en el sistema. La propiedad IsLoadable filtra los complementos instalados según la configuración actual y comprueba que la aplicación pueda cargar y utilizar el serializador. SerializerDescriptor también proporciona otras propiedades, tales como DisplayName y DefaultFileExtension, que la aplicación puede utilizar para solicitar al usuario la selección de un serializador para un formato de salida disponible. Se proporciona un serializador de complemento predeterminado para XPS con .NET Framework, que siempre se enumera. Después de que el usuario selecciona un formato de salida, se utiliza el método CreateSerializerWriter para crear una clase SerializerWriter para el formato concreto. A continuación, se puede llamar al método SerializerWriter.Write para generar la secuencia de salida del documento al almacén de datos.

En el ejemplo siguiente se muestra una aplicación que utiliza el método SerializerProvider en una propiedad “PlugInFileFilter”. PlugInFileFilter enumera los complementos instalados y genera 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 por el usuario un nombre del archivo de salida, en el ejemplo siguiente se muestra el uso del método CreateSerializerWriter para almacenar un documento determinado en un formato especificado. Para obtener el ejemplo completo, consulte Ejemplo Document Serialization.

// 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;
}

Instalar serializadores de complemento

La clase SerializerProvider proporciona la interfaz de aplicaciones de nivel superior para la detección del serializador de complemento y tener acceso a él. SerializerProvider busca y proporciona a la aplicación una lista de los serializadores instalados y accesibles en el sistema. Las características concretas de los serializadores instalados se definen mediante valores de configuración del Registro. Los serializadores de complemento se pueden agregar al Registro mediante el método RegisterSerializer; o bien, si .NET Framework no está instalado aún, el propio script de instalación del complemento puede configurar directamente los valores del Registro. El método UnregisterSerializer se puede utilizar para quitar un complemento previamente instalado; si se prefiere, la configuración del Registro se puede restablecer mediante un script de desinstalación.

Crear un serializador de complemento

Tanto los serializadores de complemento como los serializadores vinculados utilizan los mismos métodos y eventos públicos expuestos; de igual modo, pueden diseñarse para funcionar de manera sincrónica o asincrónica. Para crear un serializador de complemento se suelen seguir tres pasos básicos:

  1. Implementar y depurar el serializador en primer lugar como serializador vinculado. Crear inicialmente el serializador compilado y vinculado directamente en una aplicación de prueba proporciona acceso total a los puntos de interrupción y a otros servicios de depuración útiles para la realización de pruebas.

  2. Una vez probado completamente el serializador, se agrega una interfaz ISerializerFactory para crear un complemento. La interfaz ISerializerFactory permite el acceso pleno a todos los objetos .NET Framework, lo que incluye el árbol lógico, los objetos UIElement, IDocumentPaginatorSource y los elementos Visual. Por añadidura, ISerializerFactory proporciona los mismos métodos y eventos sincrónicos y asincrónicos utilizados por los serializadores vinculados. Puesto que los documentos grandes pueden tardar tiempo en generarse, se recomiendan operaciones asincrónicas para mantener la sensibilidad a las interacciones con el usuario y proporcionar una opción de cancelación si se presenta cualquier problema con el almacén de datos.

  3. Una vez creado el serializador de complemento, se implementa un script de instalación para distribuir e instalar (y desinstalar) el complemento (consulte la sección anterior “Instalar serializadores de complemento”).

Vea también

Tareas

Printing an XPS Document

Ejemplo Document Serialization

Conceptos

Documentos en Windows Presentation Foundation

Información general sobre impresión

Referencia

System.Windows.Documents.Serialization

XpsDocumentWriter

XpsDocument

Otros recursos

XPS