共用方式為


XamlWriter.Save 的序列化限制

API Save 可用來將 Windows Presentation Foundation (WPF) 應用程式的內容序列化為 Extensible Application Markup Language (XAML) 檔案。 不過,究竟要將哪些項目序列化,則有一些值得注意的限制。 本主題將說明這些限制及一些一般考量。

執行階段而非設計階段的表示法

透過呼叫 Save 來將項目序列化的基本原理是,結果將在執行階段以要序列化的物件來表示。 原始 XAML 檔案的許多設計階段屬性可能已在 XAML 載入為記憶體內部物件時最佳化或遺失,且在您呼叫 Save 進行序列化時不會保留。 序列化的結果是有效呈現應用程式建構的邏輯樹狀結構,但不一定是產生它的原始 XAML。 這些問題使得使用 Save 序列化作為廣泛 XAML 設計介面的一部分極為困難。

序列化是獨立的

Save 的序列化輸出是獨立的;要序列化的所有內容都包含於 XAML 單一頁面上、具有單一根元素,而且沒有 URI 以外的外部參考。 例如,如果您的頁面會參考來自應用程式資源的資源,這些資源的顯示方式,就像它們是要序列化的頁面元件一樣。

延伸模組參考已取值

透過各種不同標記延伸格式 (例如 StaticResourceBinding) 對物件所做的一般參考,將透過序列化程序來取值。 這些已經在應用程式執行階段建立記憶體內部物件期間加以取值,而且 Save 邏輯不會重新瀏覽原始的 XAML,以將這類參考還原至序列化的輸出中。 這可能會凍結任何資料繫結或資源取得的值,以做為執行階段表示法上一次使用的值,只透過有限或間接的方式來區分這類值與本機設定的任何其他值。 映像也會序列化為對映像的物件參考 (當它們存在於專案中,而不是原始來源參考),會遺失原本所參考的任何檔名或 URI。 實際上已將在同一個頁面內宣告的資源序列化至參考它們的點,而不是保留為資源集合的關鍵字。

不會保留事件處理

透過 XAML 加入的事件處理常式均已序列化,不會保留它們。 不具程式碼後置 (而且沒有相關的 x:Code 機制) 的 XAML,無法序列化執行階段程序邏輯。 由於序列化是獨立且受限於邏輯樹狀結構,所以,沒有任何功能可用來儲存事件處理常式。 因此,會從輸出 XAML 中移除事件處理常式屬性 (屬性本身以及為處理常式命名的字串值)。

使用 XAMLWriter.Save 的真實案例

雖然此處所列的限制相當多,但仍有數個使用 Save 進行序列化的適當案例。

  • 向量或圖形輸出︰重新載入時,可以使用轉譯區域的輸出,重新產生相同的向量或圖形。

  • Rich Text 格式和非固定格式文件︰輸出中會保留文字與所有已格式化的元素及其內部的元素內含項目。 這適用於估計剪貼簿功能的機制。

  • 保留商務物件資料︰如果您已將資料儲存於自訂元素中 (例如 XML 資料),只要您的商務物件遵循基本的 XAML 規則 (例如,提供適用於傳址屬性值的自訂建構函式和轉換),就可透過序列化永久保存這些商務物件。