Как сериализовать прикрепленные свойства - PullRequest
3 голосов
/ 23 октября 2009

Я пишу .NET3.5, приложение WPF с использованием библиотеки составных приложений. Приложение разделено на несколько модулей.

В модуле инфраструктуры я определил объект NetworkNode. Сетевой модуль управляет коллекцией сетевых узлов и использует XmlSerializer для хранения / загрузки этой коллекции. Пока все работает.

Но у меня есть другие модули, например, NodeModule. Если в сетевом модуле выбран NetworkNode, событие публикуется в других модулях с помощью EventAggregator. Эти модули могут прикреплять различную информацию к сетевому узлу, используя прикрепленные свойства.

Проблема в том, что NetworkModule не знает о других модулях, поэтому эти свойства не сериализуются. Можно как-то перечислить и сериализовать все свойства, прикрепленные к объекту? Или мне нужно изменить концепцию и использовать что-то еще, кроме прикрепленных свойств?

Привет

Ответы [ 3 ]

3 голосов
/ 23 октября 2009

Вы можете перечислить все свойства зависимостей (прикрепленные или нет), определенные для объекта, используя DependencyObject.GetLocalValueEnumerator:

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

Тем не менее, это не поможет для сериализации XML (если вы не реализуете IXmlSerializable, а это неприятно ...). Вы, вероятно, должны использовать XamlWriter вместо этого (что, как я полагаю, и есть то, о чем говорил Дрю, поскольку XamlSerializer ...)

3 голосов
/ 23 октября 2009

Поскольку вложенные свойства не видны с точки зрения чистого CLR, XmlSerializer не может знать о них. Вам нужно будет переключиться на использование архитектуры XamlSerializer, чтобы иметь возможность сериализации обоих «простых» объектов CLR, а также иметь специальные знания DependencyObjects.

1 голос
/ 25 мая 2012

Если вы используете .Net 4.0 (я думаю, что они не в .Net 3.5)

Вы можете использовать IAttachedPropertyStore или AttachablePropertyServices

Справочный пример № 1: http://blogs.msdn.com/b/bursteg/archive/2009/05/18/xaml-in-net-4-0-attached-properties-iattachedpropertystore-and-attachablepropertyservices.aspx

Кроме того, обычно присоединенное свойство должно быть определено правильно:

  1. Это должно быть свойство публичного (или внутреннего произведения в некоторых сценариях) не вложенного типа (т. Е. Оно не объявлено внутри другого типа), т.
  2. Определить новый AttachableMemberIdentifier (T, «MyProperty»)
  3. Предоставить открытые статические методы для T, называемые «SetMyProperty» и «GetMyProperty», т. Е. Часть «MyProperty» должна соответствовать вашему AttachableMemberIdentifier. (Вы не можете использовать «Foo» в качестве имени в AttachableMemberIdentifier и называть их «SetBar» и «GetBar», поскольку стек сериализатора Xaml должен найти их по отражению.) Затем эти методы должны использовать AttachablePropertyServices для хранения значения присоединенного свойства .

Справочный пример № 2: http://blogs.msdn.com/b/mwinkle/archive/2009/12/07/attachedproperty-part-2-putting-it-together.aspx

...