Serializacja i magazyn dokumentów
Program Microsoft .NET Framework udostępnia zaawansowane środowisko do tworzenia i wyświetlania dokumentów wysokiej jakości. Ulepszone funkcje, które obsługują zarówno stałe dokumenty, jak i dokumenty przepływu, zaawansowane kontrolki wyświetlania w połączeniu z zaawansowanymi funkcjami graficznymi 2D i 3D, umożliwiają aplikacjom platformy .NET Framework nowy poziom jakości i środowiska użytkownika. Możliwość elastycznego zarządzania reprezentacją dokumentu w pamięci jest kluczową funkcją programu .NET Framework, a możliwość wydajnego zapisywania i ładowania dokumentów z magazynu danych wymaga niemal każdej aplikacji. Proces konwertowania dokumentu z wewnętrznej reprezentacji w pamięci do zewnętrznego magazynu danych jest określany jako serializacja. Odwrotny proces odczytywania magazynu danych i odtwarzania pierwotnej instancji w pamięci nazywany jest deserializacją.
Informacje o serializacji dokumentów
W idealnym przypadku proces serializacji i deserializacji dokumentu do i z powrotem do pamięci jest przezroczysty dla aplikacji. Aplikacja wywołuje metodę "write" serializatora w celu zapisania dokumentu, podczas gdy metoda deserializatora "read" uzyskuje dostęp do magazynu danych i ponownie utworzy oryginalne wystąpienie w pamięci. Określony format, w którym są przechowywane dane, nie jest zwykle problemem aplikacji, o ile proces serializowania i deserializacji ponownie tworzy dokument z powrotem do oryginalnego formularza.
Aplikacje często udostępniają wiele opcji serializacji, które umożliwiają użytkownikowi zapisywanie dokumentów na innym nośniku lub w innym formacie. Na przykład aplikacja może oferować opcje "Zapisz jako" do przechowywania dokumentu w pliku dysku, bazie danych lub usłudze internetowej. Podobnie różne serializatory mogą przechowywać dokument w różnych formatach, takich jak HTML, RTF, XML, XPS lub format należący do osoby trzeciej. Dla aplikacji serializacja definiuje interfejs, który izoluje szczegóły medium przechowywania w ramach implementacji każdego konkretnego serializatora. Oprócz zalet hermetyzacji szczegółów przechowywania, interfejsy API platformy .NET Framework System.Windows.Documents.Serialization oferują kilka innych ważnych funkcji.
Funkcje serializatorów dokumentów programu .NET Framework 3.0
Bezpośredni dostęp do obiektów dokumentów wysokiego poziomu (drzewa logicznego i wizualizacji) umożliwia wydajne przechowywanie zawartości podzielonej na strony, elementów 2D/3D, obrazów, multimediów, hiperlinków, adnotacji i innej zawartości pomocy technicznej.
Operacja synchroniczna i asynchroniczna.
Obsługa rozszerzonych możliwości wtyczkowych serializatorów.
Dostęp do całego systemu do użytku przez wszystkie aplikacje .NET Framework.
Prosta możliwość odnajdywania wtyczek aplikacji.
Proste wdrażanie, instalacja i aktualizacja niestandardowych wtyczek innych firm.
Obsługa interfejsu użytkownika dla niestandardowych ustawień i opcji w czasie działania.
Ścieżka wydruku XPS
Ścieżka wydruku Microsoft .NET Framework XPS udostępnia również rozszerzalny mechanizm pisania dokumentów poprzez wyniki wydruku. XPS służy zarówno jako format pliku dokumentu, jak i jest natywnym formatem buforu wydruku dla systemu Windows Vista. Dokumenty XPS można wysyłać bezpośrednio do drukarek zgodnych z systemem XPS bez konieczności konwersji na format pośredni. Aby uzyskać dodatkowe informacje na temat opcji wyjściowych i możliwości ścieżki wydruku, zobacz Omówienie drukowania.
Serializatory wtyczek
Interfejsy API System.Windows.Documents.Serialization zapewniają obsługę zarówno serializatorów wtyczek, jak i połączonych serializatorów, które są instalowane oddzielnie od aplikacji, wiązane w czasie wykonywania i dostępne przy użyciu mechanizmu odnajdywania SerializerProvider. Serializatory typu wtyczki oferują zwiększone korzyści dla ułatwienia wdrożenia i używania w całym systemie. Połączone serializatory można również zaimplementować w środowiskach o częściowym zaufaniu, takich jak aplikacje przeglądarki XAML (XBAPs), gdzie wtyczkowe serializatory nie są dostępne. Połączone serializatory, które są oparte na pochodnej implementacji klasy SerializerWriter, są kompilowane i połączone bezpośrednio z aplikacją. Zarówno serializatory wtyczek, jak i połączone serializatory działają za pomocą identycznych metod publicznych i zdarzeń, co ułatwia korzystanie z obu typów serializatorów w tej samej aplikacji.
Wtyczki do serializacji pomagają deweloperom aplikacji, zapewniając rozszerzalność do nowych projektów przechowywania danych i formatów plików bez konieczności pisania kodu bezpośrednio dla każdego potencjalnego formatu podczas budowania. Serializatory wtyczek przynoszą także korzyści dla deweloperów zewnętrznych, oferując ustandaryzowany sposób wdrażania, instalacji i aktualizacji wtyczek dostępnych dla systemu do obsługi niestandardowych lub firmowych formatów plików.
Używanie serializatora wtyczki
Serializatory wtyczkowe są łatwe w użyciu. Klasa SerializerProvider wylicza obiekt SerializerDescriptor dla każdej wtyczki zainstalowanej w systemie. Właściwość IsLoadable filtruje zainstalowane wtyczki na podstawie bieżącej konfiguracji i sprawdza, czy serializator może zostać załadowany i użyty przez aplikację. SerializerDescriptor udostępnia również inne właściwości, takie jak DisplayName i DefaultFileExtension, których aplikacja może użyć, aby monitować użytkownika o wybranie serializatora dla dostępnego formatu wyjściowego. Domyślny serializator wtyczek dla systemu XPS jest dostarczany z programem .NET Framework i jest zawsze wyliczany. Gdy użytkownik wybierze format danych wyjściowych, metoda CreateSerializerWriter zostanie użyta do utworzenia SerializerWriter dla określonego formatu. Następnie można wywołać metodę SerializerWriter.Write w celu wyprowadzenia strumienia dokumentu do magazynu danych.
Poniższy przykład ilustruje aplikację, która używa metody SerializerProvider we właściwości "PlugInFileFilter". PlugInFileFilter wylicza zainstalowane wtyczki i tworzy ciąg filtru z dostępnymi opcjami plików dla 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;
}
}
Po wybraniu nazwy pliku wyjściowego przez użytkownika poniższy przykład ilustruje użycie metody CreateSerializerWriter do przechowywania danego dokumentu w określonym formacie.
// 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;
}
Instalacja serializatorów wtyczek
Klasa SerializerProvider dostarcza interfejs aplikacji najwyższego poziomu na potrzeby odnajdywania i uzyskiwania dostępu do serializatora wtyczek. SerializerProvider lokalizuje i udostępnia aplikację listę serializatorów, które są zainstalowane i dostępne w systemie. Specyfiki zainstalowanych serializatorów są definiowane za pomocą ustawień rejestru. Serializatory wtyczek można dodać do rejestru przy użyciu metody RegisterSerializer; lub jeśli program .NET Framework nie jest jeszcze zainstalowany, skrypt instalacji wtyczki może bezpośrednio ustawić wartości rejestru. Metodę UnregisterSerializer można użyć do usunięcia wcześniej zainstalowanej wtyczki lub ustawienia rejestru można zresetować podobnie za pomocą skryptu dezinstalacji.
Tworzenie serializatora wtyczki
Zarówno serializatory typu plug-in, jak i połączone serializatory używają tych samych dostępnych metod publicznych i zdarzeń, i można je zaprojektować tak, aby działały synchronicznie lub asynchronicznie. Aby utworzyć serializator wtyczki, zwykle są wykonywane trzy podstawowe kroki:
Najpierw zaimplementuj i debuguj serializator jako połączony serializator. Początkowo tworzenie serializatora skompilowanego i połączonego bezpośrednio w aplikacji testowej zapewnia pełny dostęp do punktów przerwania i innych usług debugowania przydatnych do testowania.
Po pełnym przetestowaniu serializatora zostanie dodany interfejs ISerializerFactory w celu utworzenia wtyczki. Interfejs ISerializerFactory umożliwia pełny dostęp do wszystkich obiektów programu .NET Framework, w tym drzewa logicznego, obiektów UIElement, IDocumentPaginatorSourcei elementów Visual. Ponadto ISerializerFactory zapewnia te same metody synchroniczne i asynchroniczne oraz zdarzenia używane przez połączone serializatory. Ponieważ generowanie dużych dokumentów może zająć trochę czasu, zaleca się operacje asynchroniczne, aby utrzymać płynną interakcję z użytkownikiem i oferować opcję "Anuluj", jeśli wystąpi jakiś problem w bazie danych.
Po utworzeniu serializatora wtyczki skrypt instalacji jest implementowany do dystrybucji i instalowania (i odinstalowywania) wtyczki (zobacz powyżej "Instalowanie serializatorów wtyczek").
Zobacz też
.NET Desktop feedback