Sdílet prostřednictvím


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.

Při spuštění, nikoli Design-Time reprezentace

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í souvisejících s návrhem původního souboru XAML může být již optimalizováno nebo ztraceno v době, kdy je XAML načten jako objekty v paměti, a nejsou zachovány, když voláte Save k serializaci. Serializovaný výsledek je efektivní reprezentace vytvořeného logického stromu aplikace, ale ne nutně původního XAML, který jej vytvořil. Problémy velmi znesnadňují použití serializace Save jako součást rozsáhlého prostředí návrhu XAML.

Serializace je Self-Contained

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 kromě identifikátorů URI. Pokud například vaše stránka odkazuje na prostředky aplikace, zobrazí se tyto prostředky jako součást stránky, která je serializována.

Odkazy na rozšíření jsou zpětně získávány

Běžné odkazy na objekty vytvořené různými formáty rozšíření značek, jako jsou StaticResource nebo Binding, budou odkázány z paměti prostřednictvím procesu serializace. Tyto objekty již byly dereferencovány v době, kdy byly objekty v paměti vytvořeny modulem runtime aplikace, a logika Save se nevrací na původní XAML k obnovení takových odkazů na serializovaný výstup. Tím se potenciálně zafixuje jakákoli hodnota z datového nebo zdrojového svázání, která je naposledy použita za běhu, a to pouze s omezenou nebo nepřímou schopností odlišit takovou hodnotu od jakékoli jiné hodnoty nastavené místně. Obrázky jsou také serializovány jako odkazy na objekty obrázků, které existují v projektu, místo jako původní zdrojové odkazy, čímž ztrácí jakýkoli původní název souboru nebo identifikátor URI, na které bylo původně odkazováno. Dokonce i zdroje deklarované na stejné stránce jsou serializovány do okamžiku, kde byly odkázány, místo aby se zachovaly jako klíč kolekce zdrojů.

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 code-behind (a také bez souvisejícího mechanismu x:Code) nemá způsob, jak serializovat proceduralní logiku za běhu. 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á, stále existuje 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é připomínají 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.