如何序列化附加属性

时间:2009-10-23 13:48:15

标签: c# .net wpf serialization attached-properties

我正在使用Composite Application Library编写.NET3.5,WPF应用程序。应用程序分为几个模块。

在基础架构模块中,我定义了NetworkNode对象。网络模块管理网络节点的集合,并使用XmlSerializer来存储/加载此集合。到目前为止,每件事都有效。

但我有其他模块,例如NodeModule。如果在网络模块中选择了NetworkNode,则会使用EventAggregator将事件发布到其他模块。这些模块可以使用附加属性将各种信息附加到NetworkNode。

问题是NetworkModule不了解其他模块,因此这些属性未被序列化。有可能以某种方式列出并序列化附加到对象的所有属性?或者我是否必须更改概念并使用除附加属性之外的其他内容?

此致

3 个答案:

答案 0 :(得分:3)

由于从纯CLR透视图中看不到附加属性,因此XmlSerializer无法了解它们。您需要切换到使用XamlSerializer架构,以便能够序列化“普通”CLR对象以及具有DependencyObjects的特殊知识。

答案 1 :(得分:3)

您可以使用DependencyObject.GetLocalValueEnumerator列出在对象上定义的所有依赖项属性(附加或不附加):

    LocalValueEnumerator propEnumerator = foo.GetLocalValueEnumerator();
    while (propEnumerator.MoveNext())
    {
        Console.WriteLine ("{0} = {1}",
                           propEnumerator.Current.Property.Name,
                           propEnumerator.Current.Value);
    }

但是,这对XML序列化没有帮助(除非你实现了IXmlSerializable,这很痛苦......)。您应该使用XamlWriter代替(我假设是Drew所说的,因为没有XamlSerializer ...)

答案 2 :(得分:1)

如果您使用.Net 4.0(我相信它们不在.Net 3.5中)

您可以使用IAttachedPropertyStoreAttachablePropertyServices

参考例#1:http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

此外,通常,必须正确定义附加属性:

  1. 它必须是公共属性(或某些情况下的内部作品)非嵌套类型(即它未在其他类型中声明),T。
  2. 定义新的AttachableMemberIdentifier(T,“MyProperty”)
  3. 在T上提供名为“SetMyProperty”和“GetMyProperty”的公共静态方法,即“MyProperty”部分必须与您的AttachableMemberIdentifier相匹配。 (你不能使用“Foo”作为AttachableMemberIdentifier中的名称,并将它们称为“SetBar”和“GetBar”,因为Xaml序列化程序堆栈需要通过反射来查找它们。)然后,这些方法应利用AttachablePropertyServices存储附加的属性值
  4. 参考例#2:http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx