Поделиться через


Сериализация и хранение документов

Платформа Microsoft .NET Framework предоставляет мощную среду для создания и отображения документов высокого качества. Улучшенные возможности, поддерживающие фиксированные и потоковые документы, улучшенные элементы управления для просмотра, объединенные с мощными возможностями двумерной и трехмерной графики, выводят приложения платформы .NET Framework на новый уровень по качеству и удобству использования. Ключевая возможность платформы .NET Framework — способность гибко управлять представлением документа в памяти. Эффективное сохранение и загрузка документов из хранилища данных также востребованы практически в каждом приложении. Процесс преобразования документа из внутреннего представления в памяти во внешнее хранилище данных называется сериализацией. Обратный процесс чтения из хранилища данных и повторного создания исходного экземпляра в памяти называется десериализацией.

В этом разделе содержатся следующие подразделы.

  • О сериализации документов
  • Подключаемые модули сериализаторов
  • Связанные разделы

О сериализации документов

В идеальном случае процесс сериализации и десериализации документов из памяти и обратно в нее является понятным для приложения. Приложение вызывает метод "write" сериализатора для сохранения документа, а метод "read" десериализатора получает доступ к хранилищу данных и воссоздает исходный экземпляр в памяти. Формат, в котором хранятся данные, обычно не имеет значения для приложения при условии, что процесс сериализации и десериализации воссоздает документ в исходном виде.

Приложения часто предоставляют несколько параметров сериализации, которые позволяют пользователям сохранять документы на другом носителе или в другом формате. Например, приложение может предложить варианты "Сохранить как" для сохранения документа в файле на диске, в базе данных или веб-службе. Точно так же разные сериализаторы могут сохранять документ в различных форматах, например в HTML, RTF, XML, XPS или в ином, стороннем формате. Для приложения сериализация определяет интерфейс, который изолирует сведения о носителе в реализации каждого определенного сериализатора. Дополнительно к преимуществам инкапсулируемых сведений о хранилище .NET Framework System.Windows.Documents.Serialization APIs предоставляет несколько других важных возможностей.

Возможности сериализаторов документов платформы .NET Framework версии 3.0

  • Прямой доступ к объектам документа высокого уровня (логическому дереву и графическим компонентам) позволяет обеспечить эффективное хранение страничного содержимого, двумерных и трехмерных элементов, изображений, мультимедийных данных, гиперссылок, примечаний и другого дополнительного содержимого.

  • Синхронное и асинхронное выполнение.

  • Поддержка подключаемых модулей сериализаторов с расширенными возможностями:

    • Доступ ко всей системе, который может использоваться всеми приложениями платформы .NET Framework.

    • Простое обнаружение подключаемых модулей приложения.

    • Простое развертывание, установка и обновление пользовательских подключаемых модулей сторонних разработчиков.

    • Поддержка пользовательским интерфейсом настраиваемых параметров во время выполнения.

Процесс печати с использованием XPS

При печати с использованием Microsoft .NET Framework XPS обеспечивается расширяемый механизм создания документов посредством вывода на печать. XPS служит как формат файла документа и собственный формат очереди печати Windows Vista. Документы XPS можно передавать напрямую в принтеры, совместимые с XPS, без преобразования в промежуточный формат. Дополнительные сведения о параметрах и возможностях вывода на печать см. в разделе общих сведений Общие сведения о печати.

Подключаемые модули сериализаторов

Интерфейсы API System.Windows.Documents.Serialization обеспечивают поддержку подключаемых модулей сериализаторов и связанных сериализаторов, которые устанавливаются отдельно от приложения, привязываются во время выполнения и доступ к ним осуществляется с помощью механизма обнаружения SerializerProvider. Подключаемые модули сериализаторов предоставляют дополнительные преимущества для простоты развертывания и использования в масштабе всей системы. Связанные сериализаторы также можно реализовать для сред частичного доверия, например для XAML browser applications (XBAPs), где недоступны подключаемые модули сериализаторов. Связанные сериализаторы, основанные на производной реализации класса SerializerWriter, компилируются и связываются непосредственно в приложении. Подключаемые модули сериализаторов и связанные сериализаторы работают через одни и те же открытые методы и события, что позволяет легко использовать один или оба типа сериализаторов в одном и том же приложении.

Подключаемые модули сериализаторов помогают разработчикам приложений, предоставляя расширяемость новым разработкам хранилищ и форматам файлов без непосредственного написания кода для всех возможных форматов во время построения. Подключаемые модули сериализаторов также предоставляют преимущества сторонним разработчикам, предоставляя стандартизированные средства для развертывания, установки и обновления системных доступных подключаемых модулей для пользовательских или собственных форматов файлов.

Использование подключаемых модулей сериализаторов

Подключаемые модули сериализаторов просты в использовании. Класс SerializerProvider перечисляет объект SerializerDescriptor для каждого подключаемого модуля, установленного в системе. Свойство IsLoadable фильтрует установленные подключаемые модули на основе текущей конфигурации и проверяет, может ли приложение загрузить и использовать сериализатор. SerializerDescriptor также предоставляет другие свойства, такие как DisplayName и DefaultFileExtension, которые приложение может использовать, чтобы предложить пользователю выбрать сериализатор для доступного выходного формата. Подключаемый по умолчанию модуль сериализатора для XPS предоставляется вместе с .NET Framework и всегда учитывается в перечислении. После того, как пользователь выбирает выходной формат, используется метод CreateSerializerWriter, чтобы создать SerializerWriter для определенного формата. Затем можно вызвать метод SerializerWriter.Write для вывода потока документа в хранилище данных.

В следующем примере показано приложение, использующее метод SerializerProvider в свойстве PlugInFileFilter. Свойство PlugInFileFilter перечисляет установленные подключаемые модули и создает строку фильтра с доступными параметрами файла для 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;
    }
}

После указания пользователем имени выходного файла, следующий пример показывает использование метода CreateSerializerWriter для сохранения полученного документа в указанном формате.

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

Установка подключаемых модулей сериализаторов

Класс SerializerProvider предоставляет интерфейс приложения верхнего уровня для обнаружения и осуществления доступа к подключаемому модулю сериализатора. SerializerProvider находит сериализаторы и предоставляет приложению список установленных и доступных в системе сериализаторов. Особенности установленных сериализаторов определяются через параметры реестра. Подключаемые модули сериализаторов можно добавить в реестр с помощью метода RegisterSerializer; или, если .NET Framework еще не установлен, установочный скрипт подключаемого модуля может непосредственно задать значения реестра. Метод UnregisterSerializer можно использовать для удаления ранее установленного подключаемого модуля или параметры реестра также могут быть сброшены с помощью скрипта удаления.

Создание подключаемых модулей сериализаторов

Подключаемые модули сериализаторов и связанные сериализаторы используют одни и те же предоставленные открытые методы и события, и так же могут быть настроены на синхронное или асинхронное выполнение. Существуют три основных шага для создания подключаемого модуля сериализатора:

  1. Реализация и отладка сериализатора сначала в виде связанного сериализатора. Первоначальное создание сериализатора, компилируемого и связываемого непосредственно в тестовом приложении предоставляет полный доступ к точкам останова и другим средствам отладки, полезным для проверки.

  2. После полной проверки сериализатора, к нему добавляется интерфейс ISerializerFactory, чтобы создать подключаемый модуль. Интерфейс ISerializerFactory предоставляет полный доступ ко всем объектам .NET Framework, включая логическое дерево, объекты UIElement, IDocumentPaginatorSource и элементы Visual. Кроме того, ISerializerFactory предоставляет одинаковые синхронные и асинхронные методы и события, используемые связанными сериализаторами. Поскольку вывод больших документов может занимать много времени, рекомендуется использовать асинхронные операции для поддержки быстродействующего взаимодействия с пользователем и предоставлять вариант "Отмена" при возникновении проблем с хранилищем данных.

  3. После создания подключаемого модуля сериализатора реализуется установочный скрипт для распространения и установки (и удаления) подключаемого модуля (см. выше в подразделе Установка подключаемых модулей сериализаторов).

См. также

Ссылки

System.Windows.Documents.Serialization

XpsDocumentWriter

XpsDocument

Основные понятия

Документы в WPF

Общие сведения о печати

Другие ресурсы

XML Paper Specification: Overview