Omezení serializace XamlWriter.Save

Rozhraní API Save lze použít k serializaci obsahu aplikace WPF (Windows Presentation Foundation) jako souboru XAML (Extensible Application Markup Language). Existují však některá významná omezení přesně v tom, co je serializováno. Tato omezení a některé obecné aspekty jsou popsané v tomto tématu.

Běhu, ne návrhové znázornění

Základní filozofie toho, co je serializováno voláním Save je, že výsledkem bude reprezentace objektu serializovaného za běhu. Mnoho vlastností návrhu původního souboru XAML již může být optimalizováno nebo ztraceno časem, kdy je XAML načten jako objekty v paměti, a nejsou zachovány při volání Save serializace. Serializovaný výsledek je efektivní reprezentace vytvořeného logického stromu aplikace, ale ne nutně původní xaml, který ho vytvořil. Tyto problémy znesnadní použití Save serializace jako součásti rozsáhlé plochy návrhu XAML.

Serializace je samostatná

Serializovaný výstup Save je samostatný; vše, co je serializováno, je obsaženo uvnitř jedné stránky XAML s jedním kořenovým prvkem a žádné externí odkazy jiné než identifikátory URI. Pokud například vaše stránka odkazovala na prostředky z prostředků aplikace, zobrazí se tyto prostředky jako součást stránky, která je serializována.

Odkazy na rozšíření jsou dereferenced

Běžné odkazy na objekty vytvořené různými formáty rozšíření značek, například StaticResource nebo Binding, budou dereference prostřednictvím procesu serializace. Tyto objekty již byly dereferenced v době, kdy byly objekty v paměti vytvořeny modulem runtime aplikace, a Save logika nereviduje původní XAML k obnovení takových odkazů na serializovaný výstup. Tím se potenciálně zablokuje jakákoli hodnota získaná datovou nebo zdrojovou hodnotou, která je naposledy používána reprezentací za běhu, a to pouze s omezenou nebo nepřímou schopností odlišit takovou hodnotu od jakékoli jiné sady hodnot místně. Obrázky jsou také serializovány jako odkazy na objekty na obrázky, které existují v projektu, místo jako původní zdrojové odkazy, ztrátě jakéhokoli názvu souboru nebo identifikátoru URI původně odkazovány. Dokonce i prostředky deklarované na stejné stránce jsou zobrazeny serializovány do bodu, kde byly odkazovány, místo aby se zachovaly jako klíč kolekce prostředků.

Zpracování událostí se nezachová

Pokud jsou obslužné rutiny událostí přidané prostřednictvím XAML serializovány, nezachovají se. XAML bez kódu za kódem (a také bez souvisejícího mechanismu x:Code) nemá způsob serializace procedurální logiky modulu runtime. Vzhledem k tomu, že serializace je samostatná a omezená na logický strom, neexistuje žádné zařízení pro ukládání obslužných rutin událostí. V důsledku toho jsou atributy obslužné rutiny události, a to jak samotný atribut, tak řetězcová hodnota, která obslužnou rutinu pojmenuje, odebrány z výstupního XAML.

Realistické scénáře použití XAMLWriter.Save

I když zde uvedená omezení jsou poměrně podstatná, existuje stále několik vhodných scénářů pro použití Save pro serializaci.

  • Vektorový nebo grafický výstup: Výstup vykreslené oblasti lze použít k reprodukování stejného vektoru nebo grafiky při opětovném načtení.

  • Dokumenty s formátovaným textem a tokem: Text a veškeré formátování elementů a zahrnutí elementů v něm zůstanou ve výstupu zachovány. To může být užitečné pro mechanismy, které se blíží funkci schránky.

  • Zachování dat obchodního objektu: Pokud máte uložená data ve vlastních prvcích, jako jsou data XML, pokud obchodní objekty dodržují základní pravidla XAML, jako je poskytování vlastních konstruktorů a převod hodnot vlastností podle odkazu, mohou být tyto obchodní objekty zachovány prostřednictvím serializace.