Ograniczenia serializacji XamlWriter.Save

Interfejs API Save może służyć do serializacji zawartości aplikacji Windows Presentation Foundation (WPF) jako pliku Extensible Application Markup Language (XAML). Istnieją jednak pewne istotne ograniczenia w dokładnie tym, co jest serializowane. Te ograniczenia i niektóre ogólne zagadnienia zostały opisane w tym temacie.

Reprezentacja w czasie wykonywania, a nie w czasie projektowania

Podstawową filozofią tego, co jest serializowane przez wywołanie, Save jest to, że wynik będzie reprezentacją obiektu serializowanego w czasie wykonywania. Wiele właściwości czasu projektowania oryginalnego pliku XAML może być już zoptymalizowanych lub utraconych przez czas ładowania kodu XAML jako obiektów w pamięci i nie są zachowywane podczas wywoływania Save serializacji. Serializowany wynik jest efektywną reprezentacją skonstruowanego drzewa logicznego aplikacji, ale niekoniecznie oryginalnego kodu XAML, który go wyprodukował. Te problemy sprawiają, że bardzo trudno jest używać Save serializacji w ramach obszernej powierzchni projektowej XAML.

Serializacja jest samodzielna

Serializowane dane wyjściowe programu Save są samodzielne; wszystko, co jest serializowane, znajduje się wewnątrz pojedynczej strony XAML, z jednym elementem głównym i nie ma odwołań zewnętrznych innych niż identyfikatory URI. Jeśli na przykład strona odwołuje się do zasobów aplikacji, będą one wyświetlane tak, jakby były składnikiem strony, która jest serializowana.

Odwołania do rozszerzeń są dereferenced

Typowe odwołania do obiektów w różnych formatach rozszerzeń znaczników, takich jak StaticResource lub Binding, zostaną wyłuszone przez proces serializacji. Zostały one już wyłudzonych w czasie, gdy obiekty w pamięci zostały utworzone przez środowisko uruchomieniowe aplikacji, a logika Save nie zwraca oryginalnego kodu XAML w celu przywrócenia takich odwołań do serializowanych danych wyjściowych. Potencjalnie powoduje to zablokowanie wszelkich danych przychodzących lub uzyskanych wartości jako wartości ostatnio używanej przez reprezentację w czasie wykonywania, z ograniczoną lub pośrednią możliwością odróżnienia takiej wartości od dowolnego innego zestawu wartości lokalnie. Obrazy są również serializowane jako odwołania do obiektów do obrazów, ponieważ istnieją w projekcie, a nie jako oryginalne odwołania źródłowe, tracąc dowolną nazwę pliku lub identyfikator URI pierwotnie przywoływał. Nawet zasoby zadeklarowane na tej samej stronie są widoczne serializowane w punkcie, w którym zostały przywoływane, zamiast zachowywać się jako klucz kolekcji zasobów.

Obsługa zdarzeń nie jest zachowywana

Gdy programy obsługi zdarzeń dodawane za pomocą języka XAML są serializowane, nie są zachowywane. Kod XAML bez kodu (a także bez powiązanego mechanizmu x:Code) nie ma sposobu serializacji logiki proceduralnej środowiska uruchomieniowego. Ponieważ serializacja jest samodzielna i ograniczona do drzewa logicznego, nie ma możliwości przechowywania procedur obsługi zdarzeń. W związku z tym atrybuty programu obsługi zdarzeń, zarówno sam atrybut, jak i wartość ciągu, które nazwiją program obsługi, są usuwane z wyjściowego kodu XAML.

Realistyczne scenariusze użycia biblioteki XAMLWriter.Save

Chociaż wymienione tutaj ograniczenia są dość istotne, nadal istnieje kilka odpowiednich scenariuszy użycia Save do serializacji.

  • Wektor lub dane wyjściowe graficzne: dane wyjściowe renderowanego obszaru mogą służyć do odtworzenia tego samego wektora lub grafiki podczas ponownego ładowania.

  • Dokumenty tekstu sformatowanego i przepływu: tekst i wszystkie formatowanie elementów i zawieranie w nim elementów są zachowywane w danych wyjściowych. Może to być przydatne w przypadku mechanizmów, które przybliżą funkcjonalność schowka.

  • Zachowywanie danych obiektów biznesowych: jeśli dane są przechowywane w elementach niestandardowych, takich jak dane XML, tak długo, jak obiekty biznesowe są zgodne z podstawowymi regułami XAML, takimi jak dostarczanie konstruktorów niestandardowych i konwersja dla wartości właściwości referencyjnych, te obiekty biznesowe mogą być utrwalane przez serializacji.