Sdílet prostřednictvím


Serializace a úložiště dokumentu

Microsoft .NET Framework poskytuje výkonné prostředí pro vytváření a zobrazování vysoce kvalitních dokumentů. Vylepšené funkce, které podporují dokumenty s pevnými dokumenty i dokumenty toku, pokročilé ovládací prvky zobrazení v kombinaci s výkonnými 2D a 3D grafickými funkcemi přebírají aplikace .NET Framework 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í problém aplikace, pokud serializace a deserializace proces znovu vytvoří dokument zpět do původního formuláře.

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 poskytují 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 serializátorů modulů plug-in s vylepšenými možnostmi:

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

    • Zjistitelnost modulu plug-in jednoduché aplikace

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

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

Cesta tisku ve formátu 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. Další informace o možnostech výstupu a možnostech výstupu tiskové cesty najdete v přehledu tisku.

Serializátory modulů plug-in

Rozhraní System.Windows.Documents.Serialization API poskytují podporu pro serializátory modulů plug-in i propojené serializátory, které jsou nainstalovány odděleně od aplikace, vázány za běhu a jsou přístupné pomocí SerializerProvider mechanismu zjišťování. 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. Moduly plug-in serializátory i propojené serializátory fungují prostřednictvím identických veřejných metod a událostí, které usnadňují 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 modulu plug-in

Serializátory modulů plug-in se snadno používají. Třída SerializerProvider vytvoří výčet objektu SerializerDescriptor 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 může být načten a používán aplikací. Poskytuje SerializerDescriptor také 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. S rozhraním .NET Framework je k dispozici výchozí serializátor plug-in pro XPS a je vždy uveden. Jakmile uživatel vybere výstupní formát, CreateSerializerWriter použije se metoda k vytvoření SerializerWriter konkrétního formátu. Metodu SerializerWriter.Write pak lze volat pro výstup streamu dokumentu do úložiště dat.

Následující příklad ukazuje aplikaci, která používá metodu SerializerProvider v "PlugInFileFilter" vlastnost. Modul PlugInFileFilter vytvoří výčet nainstalovaných modulů plug-in a vytvoří řetězec filtru s dostupnými možnostmi souboru pro soubor 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;
    }
}

Jakmile uživatel vybere název výstupního souboru, následující příklad ukazuje použití CreateSerializerWriter metody 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ů modulů plug-in

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 je možné přidat do registru pomocí RegisterSerializer metody. Nebo pokud rozhraní .NET Framework ještě není nainstalované, instalační skript modulu plug-in může přímo nastavit hodnoty registru. Tuto UnregisterSerializer metodu 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 modulu plug-in

Oba moduly plug-in serializátory i propojené serializátory používají stejné vystavené veřejné metody a události a podobně lze navrhnout tak, aby fungovaly 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. Počáteční vytvoření serializátoru zkompilovaného a propojeného přímo v testovací aplikaci poskytuje úplný přístup k zarážkách a dalším ladicím službám užitečným pro testování.

  2. Po úplném otestovaní serializátoru ISerializerFactory se přidá rozhraní 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 a IDocumentPaginatorSourceVisual prvky. 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 asynchronní operace zachovat responzivní interakci uživatelů a nabídnout možnost Zrušit, pokud dojde k nějakému problému s úložištěm dat.

  3. Po vytvoření serializátoru modulu plug-in se implementuje instalační skript pro distribuci a instalaci (a odinstalaci) modulu plug-in (viz výše: Instalace serializátorů modulů plug-in).

Viz také