Serializacja dokumentu i przechowywanie

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 ponownego tworzenia oryginalnego wystąpienia w pamięci jest określany jako deserializacja.

Informacje o serializacji dokumentów

W idealnym przypadku proces serializacji i deserializacji dokumentu z, a następnie z powrotem do pamięci, jest niewidoczny 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 alternatywnie w formacie innej firmy. W aplikacji serializacja definiuje interfejs, który izoluje szczegóły nośnika magazynu w ramach implementacji każdego określonego serializatora. Oprócz zalet hermetyzacji szczegółów magazynu interfejsy API programu .NET Framework System.Windows.Documents.Serialization udostępniają 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 serializatorów wtyczek z rozszerzonymi możliwościami:

    • 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 czasu wykonywania.

Ścieżka wydruku XPS

Ścieżka wydruku microsoft .NET Framework XPS udostępnia również rozszerzalny mechanizm pisania dokumentów za pośrednictwem danych wyjściowych 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 System.Windows.Documents.Serialization API zapewniają obsługę zarówno serializatorów wtyczek, jak i połączonych serializatorów, które są instalowane oddzielnie od aplikacji, wiązania w czasie wykonywania i są dostępne przy użyciu SerializerProvider mechanizmu odnajdywania. Serializatory wtyczek oferują zwiększone korzyści w celu ułatwienia wdrażania i użycia całego systemu. Połączone serializatory można również zaimplementować w środowiskach częściowo zaufania, takich jak aplikacje przeglądarki XAML (XBAPs), gdzie serializatory wtyczek nie są dostępne. Połączone serializatory, które są oparte na pochodnej SerializerWriter implementacji klasy, 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ń, które ułatwiają korzystanie z serializatorów lub obu typów serializatorów w tej samej aplikacji.

Serializatory wtyczek pomagają deweloperom aplikacji, zapewniając rozszerzalność nowych projektów magazynu i formatów plików bez konieczności pisania kodu bezpośrednio dla każdego potencjalnego formatu w czasie kompilacji. Serializatory wtyczek również korzystają z deweloperów innych firm, zapewniając ustandaryzowane środki wdrażania, instalowania i aktualizowania dostępnych wtyczek systemu dla niestandardowych lub zastrzeżonych formatów plików.

Używanie serializatora wtyczki

Serializatory wtyczek są proste w użyciu. Klasa SerializerProvider wylicza SerializerDescriptor obiekt 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ę. Zawiera SerializerDescriptor 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, CreateSerializerWriter metoda zostanie użyta do utworzenia SerializerWriter elementu dla określonego formatu. SerializerWriter.Write Następnie można wywołać metodę w celu wyprowadzenia strumienia dokumentu do magazynu danych.

Poniższy przykład ilustruje aplikację, która używa SerializerProvider metody we właściwości "PlugInFileFilter". PlugInFileFilter wylicza zainstalowane wtyczki i tworzy ciąg filtru z dostępnymi opcjami plików dla elementu 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 CreateSerializerWriter metody 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;
}

Instalowanie 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. Wtyczki serializatory można dodać do rejestru przy użyciu RegisterSerializer metody . 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 wtyczki, jak i połączone serializatory używają tych samych uwidocznionych metod publicznych i zdarzeń, a podobnie można zaprojektować tak, aby działały synchronicznie lub asynchronicznie. Aby utworzyć serializator wtyczki, zwykle są wykonywane trzy podstawowe kroki:

  1. 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.

  2. Po pełnym przetestowaniu serializatora ISerializerFactory zostanie dodany interfejs w celu utworzenia wtyczki. Interfejs ISerializerFactory umożliwia pełny dostęp do wszystkich obiektów programu .NET Framework, w tym drzewa logicznego, UIElement obiektów i IDocumentPaginatorSourceVisual elementów. ISerializerFactory Ponadto udostępnia te same metody synchroniczne i asynchroniczne oraz zdarzenia używane przez połączone serializatory. Ponieważ duże dokumenty mogą zająć trochę czasu na dane wyjściowe, operacje asynchroniczne zaleca się zachowanie dynamicznej interakcji użytkownika i oferowanie opcji "Anuluj", jeśli wystąpi jakiś problem z magazynem danych.

  3. Po utworzeniu serializatora wtyczki skrypt instalacji jest implementowany na potrzeby dystrybucji i instalowania (i odinstalowywania) wtyczki (zobacz powyżej "Instalowanie wtyczki Serializatory").

Zobacz też