【问题标题】:When to use XamlWriter.Save() to serialize domain object?何时使用 XamlWriter.Save() 序列化域对象?
【发布时间】:2010-07-09 10:43:27
【问题描述】:

使用 XamlWriter.Save() 序列化域对象的基本原理(如果有的话)是什么? 请描述现实场景。 谢谢。

【问题讨论】:

    标签: .net wpf xaml serialization xml-serialization


    【解决方案1】:

    除非您要直接修改序列化的 XAML,否则几乎没有理由将域对象序列化为 XAML。但是在很多情况下你可能会这样做。

    例如,假设您有一个要在 Expression Blend 中设计 UI 时使用的视图模型对象。通常,您要做的是编写代码来生成对象的测试实例,然后在 Blend 项目中引用该代码。但您也可以将对象序列化为 XAML 并将 XAML 文件添加到 Blend 项目。

    这可能非常有用。完成此操作后,您可以在 Blend 中调整测试对象的属性值,方法是编辑其 XAML 表示,而不是修改创建它的代码。当然,您可以通过使用常规 XML 序列化来完成或多或少相同的事情 - 修改测试对象的构造函数使用的序列化 XML 文件与修改序列化 XAML 几乎完全相同。不同之处在于您可以将 XAML 表示直接嵌入到其他 XAML 文件中。

    您获得的另一个好处是,如果 XAML 是您的序列化格式,您可以使用标记扩展和值转换器。同样,这仅在您修改序列化 XAML 时才有用,就像我刚才描述的场景一样。

    【讨论】:

      【解决方案2】:

      Xaml 允许在 xml 中编码反射信息。 您可以在编译时序列化具有未知类型项目的对象树,然后从 xmlns:class 反序列化并识别运行时类型。

      例子:

      MyClass
      {
          public Object MyPropery
          {
              set;
              get;
          }
      }
      
      <MyClass>
          <MyClass.MyProperty>
              <ns:AnyClass />
          </MyClass.MyProperty>
      </MyClass>
      

      除此之外,如果您有自定义绑定逻辑,您可以让 xaml 包含它。 (如 WPF 和 WF 绑定。)

      【讨论】:

        【解决方案3】:

        XamlWrite.Save 旨在序列化 WPF 对象,例如 Controls/Windows(具有 xaml 表示形式),请查看:http://msdn.microsoft.com/en-us/library/ms754193.aspx。要序列化域对象,请使用 XmlSerializer。

        我做了一个简单的测试:

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Windows.Markup;
        using System.IO;
        
        namespace XamlTest
        {
            class Program
            {
                static void Main(string[] args)
                {
                    Person p = new Person() { Id = 5, Name = "SomeName" };
                    StringWriter sw = new StringWriter();
                    XamlWriter.Save(p, sw);
                    Console.Write(sw.GetStringBuilder().ToString());
                    Console.ReadLine();
                }
            }
        
            public class Person
            {
                public int Id { get; set; }
        
                public string Name { get; set; }
        
                public string Phone { get; set; }
            }
        }
        

        打印以下内容:

        <Person Id="5" Name="SomeName" Phone="{x:Null}" xmlns="clr-namespace:XamlTest;assembly=XamlTest" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />  
        

        使用它真的没有意义,我几乎可以肯定它在幕后使用了 XmlSerializer。

        【讨论】:

        • 我知道...但是由于可以对任何对象使用 XamlWriter.Save(),我想看看周围是否有人这样做,以及为什么:)
        • 看看我做的这个测试。我认为 XamlWriter 和 XmlSerializer 之间的主要区别在于它支持标记扩展和 Xaml 的特定内容。就像使用围绕 XmlSerializer 的任何 Wrapper 一样。您可以使用它,但需要对 wpf 程序集进行不必要的引用,那么为什么不直接使用 XmlSerializer 呢?
        猜你喜欢
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 2017-09-12
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 2019-06-03
        • 2019-03-09
        相关资源
        最近更新 更多