2012-05-05 2 views
1

У меня возникли проблемы с сериализацией типов, полученных через точку конечной точки WCF mex, если я использую эти типы для отображения данных в WPF.Отметить событие как NonSerialized во время выполнения с использованием отражения

Это связано с тем, что автогенерируемые типы реализуют интерфейс INotifyPropertyChanged и потому, что подписка WPF подписывается на нее.

Обычный способ сделать это будет добавление [field: NonSerialized] в объявление события. Я не хочу этого делать, потому что классы были сгенерированы автоматически.

Я также не хочу переключиться на DataContractSerializer, главным образом потому, что я нахожу BinaryFormatter, что я использую довольно удобно во всех остальных случаях.

Что бы я хотел сделать, это найти поле, в котором хранятся данные события и пометить его как NonSerialized до начала сериализации с использованием отражения.

Вот мои вопросы:

  1. Можно ли добавлять атрибуты во время выполнения?
  2. Как найти поле, связанное с событием?
+0

http://stackoverflow.com/questions/2160476/how-to-set-attributes-values-using-reflection – bit2know

+0

Это не может работать. Если вы действительно хотите избежать атрибутов вашего основного класса, тогда объявите еще один, который представляет его сериализованное состояние. Плюс код, который преобразуется от одного к другому. –

+0

Если вы используете WCF, как вы теперь используете BinaryFormatter? Единственные способы, которые я знаю, - это использовать NetDataContractSerializer и поставщика суррогат сериализации, который использует BinaryFormatter ... или создать свой собственный формуляр сообщений WCF. Я спрашиваю, потому что это имеет отношение к ответу на ваш вопрос. – Jeff

ответ

0

Вот несколько идей с головы.

  1. Создание динамических прокси-классов (которые не реализуют INotifyPropertyChanged) во время сериализации с помощью CodeDom или ILGenerator. Затем используйте что-то вроде AutoMapper для сопоставления исходного графа объектов с этими прокси-классами.

  2. Если ваша единственная реальная проблема - это подписка на события ... и вы знаете, что эти классы автоматически сгенерированы (поэтому у них нет каких-либо специальных реализаций для событий, то есть они просто используют обычную базовый делегат поля) ... вы можете временно удалить, а затем повторно добавить подписки на события во время сериализации. Случайная ссылка google: How to get a delegate object from an EventInfo?. В принципе, вы могли бы захватить все текущие подписки на события, очистить делегат, а затем повторно добавить подписки ..... или вы могли бы просто удалить нулевое поле делегата, а затем повторно установить его после завершения сериализации.

  3. Если вы не слишком обеспокоены производительности, вы можете использовать ISerializationSurrogate http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate.getobjectdata.aspx , который отражает ваш объект для всех FieldInfos и убеждается игнорировать поля, которые типа делегата.

Смежные вопросы