Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft .NET Framework предоставляет мощную среду для создания и отображения высококачественных документов. Расширенные функции, поддерживающие как фиксированные документы, так и потоковые документы, расширенные элементы управления просмотром, в сочетании с мощными графическими возможностями 2D и трехмерных графических возможностей позволяют приложениям .NET Framework обеспечить новый уровень качества и пользовательского интерфейса. Возможность гибкого управления представлением документа в памяти является ключевым компонентом .NET Framework, и возможность эффективно сохранять и загружать документы из хранилища данных является необходимостью почти для каждого приложения. Процесс преобразования документа из внутреннего представления в памяти в внешнее хранилище данных называется сериализацией. Обратный процесс чтения хранилища данных и воссоздания исходного экземпляра в памяти называется десериализацией.
Сведения о сериализации документов
В идеале процесс сериализации и десериализации документа из и обратно в память является прозрачным для приложения. Приложение вызывает метод сериализатора «write» для сохранения документа, в то время как метод десериализатора «read» обращается к хранилищу данных и воссоздает исходный экземпляр в памяти. Конкретный формат, в который хранятся данные, обычно не является проблемой приложения, если процесс сериализации и десериализации повторно создает документ обратно в исходную форму.
Приложения часто предоставляют несколько параметров сериализации, которые позволяют пользователю сохранять документы в разных средах или в другом формате. Например, приложение может предложить варианты "Сохранить как" для хранения документа в дисковый файл, базу данных или веб-службу. Аналогичным образом различные сериализаторы могут хранить документ в разных форматах, таких как HTML, RTF, XML, XPS или сторонний формат. В приложении сериализация определяет интерфейс, который изолирует сведения о носителе данных в пределах реализации каждого конкретного сериализатора. Помимо преимуществ инкапсулирования сведений о хранилище, API -NET Framework System.Windows.Documents.Serialization предоставляют несколько других важных функций.
Функции сериализаторов документов .NET Framework 3.0
Прямой доступ к высокоуровневым объектам документов (логическим деревам и визуальным элементам) обеспечивает эффективное хранение содержимого с разбивкой на страницы, 2D/3D-элементов, изображений, мультимедиа, гиперссылок, заметок и другого содержимого поддержки.
Синхронная и асинхронная операция.
Поддержка подключаемых сериализаторов с расширенными возможностями:
Системный доступ для использования всеми приложениями .NET Framework.
Простота обнаружения плагина приложения.
Простое развертывание, установка и обновление пользовательских подключаемых модулей сторонних разработчиков.
Поддержка пользовательского интерфейса для настроек и параметров времени выполнения.
Путь печати XPS
Путь печати Microsoft .NET Framework XPS также предоставляет расширяемый механизм для генерации документов через печатный вывод. XPS служит форматом файлов документов и родным форматом печати для Windows Vista. Документы XPS можно отправлять непосредственно в принтеры, совместимые с XPS, без необходимости преобразования в промежуточный формат. См. в разделе «Обзор печати» на для получения дополнительной информации о параметрах и возможностях вывода печатного пути.
Подключаемые сериализаторы
API-интерфейсы System.Windows.Documents.Serialization обеспечивают поддержку как подключаемых сериализаторов, так и связанных сериализаторов, которые устанавливаются отдельно от приложения, связываются во время выполнения и получают доступ через механизм обнаружения SerializerProvider. Подключаемые сериализаторы предлагают расширенные преимущества для упрощения развертывания и использования на всей системе. Связанные сериализаторы также можно реализовать для среды с частичным доверием, такой как приложения браузера XAML (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 можно использовать для удаления ранее установленного плагина или для сброса параметров реестра аналогичным образом с помощью скрипта удаления.
Создание сериализатора плагина
Как подключаемые сериализаторы, так и связанные сериализаторы используют одни и те же открытые открытые методы и события, а также могут работать синхронно или асинхронно. Чтобы создать сериализатор плагина, обычно следует выполнить три основных шага.
Сначала реализуйте и отладьте сериализатор как связанный сериализатор. Первоначально создание сериализатора, скомпилированного и связанного непосредственно в тестовом приложении, предоставляет полный доступ к точкам останова и другим службам отладки, полезным для тестирования.
После полного тестирования сериализатора добавляется интерфейс ISerializerFactory для создания подключаемого модуля. Интерфейс ISerializerFactory предоставляет полный доступ ко всем объектам .NET Framework, включая логические деревья, объекты UIElement, IDocumentPaginatorSourceи элементы Visual. Кроме того, ISerializerFactory предоставляет те же синхронные и асинхронные методы и события, используемые связанными сериализаторами. Поскольку большие документы могут требовать времени на вывод, рекомендуется использовать асинхронные операции для поддержания взаимодействия с пользователем и предоставлять возможность "Отмена", если возникнут какие-либо проблемы с хранилищем данных.
После создания сериализатора подключаемого модуля реализуется скрипт для распространения, установки и удаления этого модуля (см. выше, "Installing Plug-in Serializers").
См. также
.NET Desktop feedback