使用XamlWriter.Save()序列化域对象的基本原理(如果有的话)是什么? 请描述现实场景。 感谢。
答案 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。