何时使用XamlWriter.Save()来序列化域对象?

时间:2010-07-09 10:43:28

标签: .net wpf xaml serialization xml-serialization

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

示例:

MyClass
{
    public Object MyPropery
    {
        set;
        get;
    }
}

<MyClass>
    <MyClass.MyProperty>
        <ns:AnyClass />
    </MyClass.MyProperty>
</MyClass>

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

答案 2 :(得分:0)

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。