Sdílet prostřednictvím


Serializace dokumentů a úložiště

Microsoft .NET Framework poskytuje výkonné prostředí pro vytváření a zobrazování vysoce kvalitních dokumentů. Vylepšené funkce, které podporují pevné dokumenty i dokumenty toku, pokročilé ovládací prvky zobrazení v kombinaci s výkonnými 2D a 3D grafickými funkcemi posouvají aplikace frameworku .NET na novou úroveň kvality a uživatelského prostředí. Schopnost flexibilně spravovat reprezentaci dokumentu v paměti je klíčovou funkcí rozhraní .NET Framework a schopnost efektivně ukládat a načítat dokumenty z úložiště dat je potřeba téměř každé aplikace. Proces převodu dokumentu z interní reprezentace v paměti na externí úložiště dat se označuje jako serializace. Reverzní proces čtení úložiště dat a opětovného vytvoření původní instance v paměti se nazývá deserializace.

O serializaci dokumentů

V ideálním případě je proces serializace a deserializace dokumentu z a pak zpět do paměti pro aplikaci transparentní. Aplikace volá metodu serializátoru "write" pro uložení dokumentu, zatímco deserializační metoda "read" přistupuje k úložišti dat a znovu vytvoří původní instanci v paměti. Konkrétní formát, ve kterém jsou data uložena, obecně není záležitostí aplikace, pokud proces serializace a deserializace znovu vytvoří dokument do jeho původní podoby.

Aplikace často poskytují více možností serializace, které uživateli umožňují ukládat dokumenty do jiného média nebo do jiného formátu. Aplikace může například nabízet možnosti Uložit jako pro uložení dokumentu do souboru disku, databáze nebo webové služby. Podobně mohou různé serializátory ukládat dokument v různých formátech, jako je HTML, RTF, XML, XPS nebo alternativně do formátu třetí strany. Pro aplikaci serializace definuje rozhraní, které izoluje podrobnosti o úložném médiu v rámci implementace každého konkrétního serializátoru. Kromě výhod zapouzdření podrobností o úložišti poskytuje rozhraní API rozhraní .NET Framework System.Windows.Documents.Serialization několik dalších důležitých funkcí.

Funkce serializátorů dokumentů rozhraní .NET Framework 3.0

  • Přímý přístup k objektům dokumentů vysoké úrovně (logický strom a vizuály) umožňuje efektivní ukládání stránkovaného obsahu, 2D/3D prvků, obrázků, médií, hypertextových odkazů, poznámek a dalších podpůrných obsahu.

  • Synchronní a asynchronní operace

  • Podpora plug-in serializátorů s vylepšenými možnostmi.

    • Systémový přístup pro použití všemi aplikacemi rozhraní .NET Framework.

    • Zjistitelnost pluginu pro jednoduché aplikace

    • Jednoduché nasazení, instalace a aktualizace vlastních plug-inů třetích stran.

    • Podpora uživatelského rozhraní pro vlastní nastavení a možnosti za běhu.

Tisková cesta XPS

Cesta tisku XPS rozhraní Microsoft .NET Framework poskytuje také rozšiřitelný mechanismus pro zápis dokumentů prostřednictvím tiskového výstupu. XPS slouží jako formát souboru dokumentu a je nativní formát fondu tisku pro systém Windows Vista. Dokumenty XPS je možné odesílat přímo do tiskáren kompatibilních se systémem XPS bez nutnosti převodu na zprostředkující formát. Podrobnější informace o možnostech a schopnostech výstupu tiskové cesty jsou uvedeny v Přehled tisku.

Pluginové serializátory

API System.Windows.Documents.Serialization poskytují podporu pro plug-in serializátory i propojené serializátory, které jsou instalovány odděleně od aplikace, váží se v době běhu a jsou přístupné pomocí mechanismu zjišťování SerializerProvider. Serializátory plug-in nabízejí vylepšené výhody pro snadné nasazení a použití v celém systému. Propojené serializátory lze také implementovat pro částečná důvěryhodná prostředí, jako jsou aplikace prohlížeče XAML (XBAPs), kde serializátory modulu plug-in nejsou přístupné. Propojené serializátory, které jsou založeny na odvozené implementaci SerializerWriter třídy, jsou zkompilovány a propojeny přímo do aplikace. Plug-in serializátory i propojené serializátory fungují prostřednictvím identických veřejných metod a událostí, což usnadňuje použití obou typů serializátorů ve stejné aplikaci.

Serializátory modulů plug-in pomáhají vývojářům aplikací tím, že poskytují rozšiřitelnost nových návrhů úložišť a formátů souborů, aniž by museli kódovat přímo pro každý potenciální formát v době sestavení. Serializátory modulů plug-in také využívají vývojáři třetích stran tím, že poskytují standardizované prostředky pro nasazení, instalaci a aktualizaci modulů plug-in s podporou vlastních nebo proprietárních formátů souborů.

Použití serializátoru zásuvného modulu

Plug-in serializátory se snadno používají. Třída SerializerProvider vytvoří výčet SerializerDescriptor objektu pro každý modul plug-in nainstalovaný v systému. Vlastnost IsLoadable filtruje nainstalované moduly plug-in na základě aktuální konfigurace a ověřuje, že serializátor lze načíst a používat aplikací. SerializerDescriptor také poskytuje další vlastnosti, například DisplayName a DefaultFileExtension, které aplikace může použít k zobrazení výzvy uživateli při výběru serializátoru pro dostupný výstupní formát. Spolu s rozhraním .NET Framework je k dispozici výchozí serializátor plug-in pro XPS a je vždy vyjmenován. Jakmile uživatel vybere výstupní formát, použije se metoda CreateSerializerWriter k vytvoření SerializerWriter pro konkrétní formát. Metoda SerializerWriter.Write se pak dá volat pro výstup streamu dokumentu do úložiště dat.

Následující příklad ukazuje aplikaci, která používá metodu SerializerProvider ve vlastnosti „PlugInFileFilter“. PlugInFileFilter vytváří seznam nainstalovaných plug-inů a sestavuje filtr s dostupnými možnostmi souborů pro 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 výběru názvu výstupního souboru uživatelem ukazuje následující příklad použití metody CreateSerializerWriter k uložení daného dokumentu v zadaném formátu.

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

Instalace serializátorů zásuvných modulů

Třída SerializerProvider poskytuje rozhraní aplikace nejvyšší úrovně pro zjišťování a přístup k modulu plug-in serializátoru. SerializerProvider vyhledá a poskytne aplikaci seznam serializátorů, které jsou nainstalovány a přístupné v systému. Specifika nainstalovaných serializátorů jsou definována prostřednictvím nastavení registru. Serializátory modulu plug-in lze přidat do registru pomocí metody RegisterSerializer; nebo pokud rozhraní .NET Framework ještě není nainstalované, instalační skript modulu plug-in může přímo nastavit hodnoty registru samotné. Metodu UnregisterSerializer lze použít k odebrání dříve nainstalovaného modulu plug-in nebo je možné nastavení registru resetovat podobně pomocí skriptu pro odinstalaci.

Vytvoření serializátoru pluginu

Oba, jak plug-in serializátory, tak propojené serializátory, využívají stejné veřejně přístupné metody a události a lze je obdobně navrhnout tak, aby fungovaly buď synchronně, nebo asynchronně. K vytvoření serializátoru modulu plug-in se obvykle používají tři základní kroky:

  1. Nejprve implementujte a laděte serializátor jako propojený serializátor. Vytvoření serializéru, který je zkompilován a propojen přímo v testovací aplikaci, poskytuje plný přístup k zarážkám a dalším ladicím službám, které jsou užitečné pro testování.

  2. Po úplném otestovaní serializátoru se přidá rozhraní ISerializerFactory pro vytvoření modulu plug-in. Rozhraní ISerializerFactory umožňuje úplný přístup ke všem objektům rozhraní .NET Framework, které zahrnují logický strom, UIElement objekty, IDocumentPaginatorSourcea Visual elementy. Kromě toho ISerializerFactory poskytuje stejné synchronní a asynchronní metody a události používané propojenými serializátory. Vzhledem k tomu, že výstup velkých dokumentů může nějakou dobu trvat, doporučujeme použití asynchronních operací, aby bylo zachováno responzivní uživatelské rozhraní a nabídnuta možnost zrušení, v případě, že nastane problém s úložištěm dat.

  3. Po vytvoření serializéru modulu plug-in se implementuje skript zaměřený na distribuci, instalaci a odinstalaci tohoto modulu (viz výše, "Instalace plug-in serializérů").

Viz také