Сериализация и хранение документов
Microsoft .NET Framework предоставляет мощную среду для создания и отображения документов высокого качества. Улучшенные возможности, поддерживающие фиксированные и потоковые документы, улучшенные элементы управления просмотром в сочетании с мощными возможностями двумерной и трехмерной графики позволяют вывести приложения .NET Framework на новый уровень качества и взаимодействия с пользователем. Возможность гибко управлять представлением документа в памяти является ключевой функцией программы .NET Framework, а также возможность эффективно сохранять и загружать документы из хранилища данных необходима практически во всех приложениях. Процесс преобразования документа из внутреннего представления в памяти во внешнее хранилище данных называется сериализацией. Обратный процесс чтения хранилища данных и воссоздания исходного экземпляра в памяти называется десериализацией.
О сериализации документов
В идеальном случае процесс сериализации и десериализации документа из памяти и в память прозрачен для приложения. Приложение вызывает метод write сериализатора для сохранения документа, в то время как метод read десериализатора осуществляет доступ к хранилищу данных и воссоздает исходный экземпляр в памяти. Как правило, формат хранения данных не имеет значения для приложения при условии, что в процессе сериализации и десериализации воссоздается документ в исходной форме.
Приложения часто предоставляют несколько параметров сериализации, которые позволяют пользователям сохранять документы на другом носителе или в другом формате. Например, приложение может предложить варианты "Сохранить как" для сохранения документа в файл на диске, базу данных или веб-службу. Аналогичным образом разные сериализаторы могут сохранять документ в различных форматах, например в HTML, RTF, XML, XPS или в ином стороннем формате. Для приложения сериализация определяет интерфейс, который изолирует сведения о носителе в реализации каждого определенного сериализатора. Помимо преимуществ инкапсуляции сведений о хранении, .NET Framework System.
Компоненты сериализаторов документов .NET Framework 3.0
Прямой доступ к высокоуровневым объектам документа (логическое дерево и визуальные элементы) позволяет эффективно хранить разделенное на страницы содержимое, двухмерные и трехмерные элементы, изображения, мультимедиа, гиперссылки, аннотации и другое содержимое поддержки.
Синхронные и асинхронные операции.
Поддержка сериализаторов подключаемых модулей с расширенными возможностями:
Доступ на уровне системы для использования всеми приложениями .NET Framework.
Удобное обнаружение подключаемых модулей приложения.
Простое развертывание, установка и обновление пользовательских подключаемых модулей сторонних производителей.
Поддержка интерфейса пользователя для пользовательских параметров и настроек среды выполнения.
Способ печати XPS
Microsoft .NET Framework XPS способ печати также предоставляет расширяемый механизм записи документов посредством вывода на печать. XPS служит как формат файла документа и имеет собственный формат очереди печати для Windows Vista. XPS документы можно отправлять непосредственно на XPS-совместимым принтерам без необходимости для преобразования в промежуточный формат. См. дополнительные сведения о параметрах и возможностях вывода пути печати в разделе Общие сведения о печати.
Подключаемые сериализаторы
System.
Подключаемые сериализаторы помогают разработчикам приложений, обеспечивая расширяемость новых проектируемых систем хранения и файловых форматов и избавляя от необходимости создавать код напрямую для каждого потенциального формата во время создания. Подключаемые сериализаторы помогают и сторонним разработчикам, предоставляя стандартизированные средства развертывания, установки и обновления доступных системе подключаемых модулей для пользовательских или собственных форматов файлов.
Использование подключаемого сериализатора
Использовать подключаемые сериализаторы достаточно просто. Serializer
В следующем примере показано приложение, использующее Serializer
// ------------------------ 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;
}
}
После выбора пользователем имя выходного файла, в следующем примере показано использование Create
// 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;
}
Установка подключаемых сериализаторов
Serializer
Создание подключаемого сериализатора
Подключаемые и связанные сериализаторы используют одинаковые предоставленные открытые методы и события, и их также можно настроить для синхронной и асинхронной работы. Для создания подключаемого сериализатора, как правило, требуется выполнить три шага.
Реализация и отладка сериализатора сначала в виде связанного сериализатора. Изначально создание сериализатора, скомпилированного и связанного непосредственно в тестовом приложении, предоставляет полный доступ к точкам останова и другим полезным для тестирования отладочным службам.
После полного тестирования сериализатора ISerializer
Factory интерфейс будет добавлен для создания подключаемого модуля. ISerializerFactory Интерфейс обеспечивает полный доступ ко всем объектам .NET Framework, включая логическое дерево, UIElement объектов, IDocumentPaginator , и Visual элементов. Кроме того ISerializerSource Factory предоставляет те же синхронные и асинхронные методы и события, которые используются связанными сериализаторами. Поскольку на вывод крупных документов может потребоваться время, рекомендуется использовать асинхронные операции, чтобы сохранить возможность взаимодействия с пользователем и предоставить возможность отмены, если с источником данных произойдет проблема.После создания подключаемого сериализатора сценарий установки реализуется для распространения и установки (и удаления) подключаемого модуля (см. Установка подключаемых сериализаторов выше).