C# 如何序列化附加的属性

C# 如何序列化附加的属性,c#,.net,wpf,serialization,attached-properties,C#,.net,Wpf,Serialization,Attached Properties,我正在使用复合应用程序库编写.NET3.5、WPF应用程序。应用程序分为几个模块 在基础架构模块中,我定义了NetworkNode对象。网络模块管理NetworkNodes集合,并使用XmlSerializer存储/加载此集合。到目前为止一切正常 但我还有其他模块,例如NodeModule。如果在网络模块中选择了NetworkNode,则使用EventAggregator将事件发布到其他模块。这些模块可以使用附加属性将各种信息附加到NetworkNode 问题是NetworkModule不知道其

我正在使用复合应用程序库编写.NET3.5、WPF应用程序。应用程序分为几个模块

在基础架构模块中,我定义了NetworkNode对象。网络模块管理NetworkNodes集合,并使用XmlSerializer存储/加载此集合。到目前为止一切正常

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

问题是NetworkModule不知道其他模块,因此这些属性没有序列化。是否可以以某种方式列出并序列化附加到对象的所有属性?或者我必须改变概念,使用附加属性以外的其他东西吗


关于

由于附加的属性从纯CLR的角度看是不可见的,所以XmlSerializer无法了解它们。您需要切换到使用XamlSerializer体系结构,以便能够序列化两个“普通”CLR对象,并具有DependencyObjects的特殊知识。

您可以使用以下命令列出对象上定义的所有依赖属性(附加或未附加):

但是,这对XML序列化没有帮助(除非您实现IXmlSerializable,这是一个难题…)。如果您使用的是.Net 4.0(我相信它们不在.Net 3.5中),您可能应该改用它(我假设Drew所说的就是这个,因为没有
XamlSerializer
…)

您可以使用或

参考示例#1:

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

  • 它必须是public(或在某些场景中是internalworks)非嵌套类型的属性(即,它不是在另一个类型中声明的),T
  • 定义新的AttachableMemberIdentifier(T,“MyProperty”)
  • 在名为“SetMyProperty”和“GetMyProperty”的T上提供公共静态方法,即“MyProperty”部分必须与AttachableMemberIdentifier匹配。(您不能在AttachableMemberIdentifier中使用“Foo”作为名称,并将它们称为“SetBar”和“GetBar”,因为Xaml序列化程序堆栈需要通过反射找到它们。)然后,这些方法应该利用AttachablePropertyServices来存储附加的属性值
  • 参考示例#2:

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