Ograniczenia serializacji XamlWriter.Save
Interfejs API Save może być używany do serializacji zawartości aplikacji Windows Presentation Foundation (WPF) jako plik języka znaczników aplikacji rozszerzalnej (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.
Czas działania, a nie reprezentacja Design-Time
Podstawowa zasada serializacji za pomocą wywołania Save jest taka, że wynik będzie reprezentacją obiektu serializowanego podczas wykonywania programu. Wiele projektowych właściwości oryginalnego pliku XAML może być już zoptymalizowanych lub utraconych w momencie, gdy XAML jest ładowany jako obiekty w pamięci, i nie są zachowywane, gdy wywołujesz Save do 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żyć serializacji Save w ramach obszernej powierzchni projektowej XAML.
Serializacja jest Self-Contained
Wynik serializowany Save jest samowystarczalny; 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ą odreferowane
Powszechne referencje do obiektów w różnych formatach rozszerzeń znaczników, takich jak "StaticResource
" lub "Binding
", zostaną wyłuszczone przez proces serializacji. Zostały już usunięte referencje w czasie, gdy obiekty w pamięci zostały utworzone przez środowisko wykonawcze aplikacji, a logika Save nie przegląda ponownie oryginalnego kodu XAML w celu przywrócenia takich referencji w zserializowanych wynikach. Potencjalnie powoduje to zablokowanie wszelkich powiązanych z danymi lub uzyskanych z zasobów wartości jako wartości ostatnio używanej przez reprezentację w trakcie wykonywania, z ograniczoną lub pośrednią możliwością odróżnienia takiej wartości od dowolnego innego lokalnie ustawionego zbioru wartości. Obrazy są również serializowane jako odniesienia do obiektów odpowiadających obrazom w takiej postaci, w jakiej istnieją w projekcie, a nie jako oryginalne odniesienia źródłowe, co powoduje utratę pierwotnie używanej nazwy pliku lub identyfikatora URI. Nawet zasoby zadeklarowane na tej samej stronie są serializowane w punkcie, w którym zostały przywoływane, zamiast być zachowanymi 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 obsługi zdarzeń, zarówno sam atrybut, jak i wartość ciągu, która nazywa obsługę, 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żywania 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ływowego: formatowanie tekstu oraz wszystkich elementów, a także hierarchia elementów w nim zawartych są zachowywane w danych wyjściowych. Może to być przydatne w przypadku mechanizmów, które naśladują funkcjonalność schowka.
Zachowywanie danych obiektów biznesowych: jeśli dane są przechowywane w elementach niestandardowych, takich jak dane XML, o ile 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 dzięki serializacji.
.NET Desktop feedback