【发布时间】:2010-07-09 10:43:27
【问题描述】:
使用 XamlWriter.Save() 序列化域对象的基本原理(如果有的话)是什么? 请描述现实场景。 谢谢。
【问题讨论】:
标签: .net wpf xaml serialization xml-serialization
使用 XamlWriter.Save() 序列化域对象的基本原理(如果有的话)是什么? 请描述现实场景。 谢谢。
【问题讨论】:
标签: .net wpf xaml serialization xml-serialization
除非您要直接修改序列化的 XAML,否则几乎没有理由将域对象序列化为 XAML。但是在很多情况下你可能会这样做。
例如,假设您有一个要在 Expression Blend 中设计 UI 时使用的视图模型对象。通常,您要做的是编写代码来生成对象的测试实例,然后在 Blend 项目中引用该代码。但您也可以将对象序列化为 XAML 并将 XAML 文件添加到 Blend 项目。
这可能非常有用。完成此操作后,您可以在 Blend 中调整测试对象的属性值,方法是编辑其 XAML 表示,而不是修改创建它的代码。当然,您可以通过使用常规 XML 序列化来完成或多或少相同的事情 - 修改测试对象的构造函数使用的序列化 XML 文件与修改序列化 XAML 几乎完全相同。不同之处在于您可以将 XAML 表示直接嵌入到其他 XAML 文件中。
您获得的另一个好处是,如果 XAML 是您的序列化格式,您可以使用标记扩展和值转换器。同样,这仅在您修改序列化 XAML 时才有用,就像我刚才描述的场景一样。
【讨论】:
Xaml 允许在 xml 中编码反射信息。 您可以在编译时序列化具有未知类型项目的对象树,然后从 xmlns:class 反序列化并识别运行时类型。
例子:
MyClass
{
public Object MyPropery
{
set;
get;
}
}
<MyClass>
<MyClass.MyProperty>
<ns:AnyClass />
</MyClass.MyProperty>
</MyClass>
除此之外,如果您有自定义绑定逻辑,您可以让 xaml 包含它。 (如 WPF 和 WF 绑定。)
【讨论】:
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。
【讨论】: