使用反射在运行时将事件标记为NonSerialized

时间:2012-05-05 21:38:50

标签: c# serialization reflection

如果我使用这些类型在WPF中显示数据,我无法序列化通过WCF mex端点获取的类型。

这是因为自动生成的类型确实实现了INotifyPropertyChanged接口,并且因为WPF绑定订阅了它。

执行此操作的常规方法是将[field:NonSerialized]添加到事件声明中。我不想这样做,因为这些类是自动生成的。

我也不想切换到DataContractSerializer,主要是因为我发现在所有其他情况下我使用的BinaryFormatter相当方便。

我想要做的是找到一个字段,在该字段中存储事件数据并在序列化开始使用反射之前将其标记为NonSerialized。

以下是我的问题:

  1. 是否可以在运行时添加属性?
  2. 如何找到与活动相关的字段?

1 个答案:

答案 0 :(得分:0)

以下是我的一些想法。

  1. 使用CodeDom或ILGenerator在序列化时创建动态代理类(未实现INotifyPropertyChanged)。然后使用类似AutoMapper的东西将原始对象图映射到这些代理类上。

  2. 如果您唯一真正的问题是事件订阅...并且您知道这些类是自动生成的(因此他们没有任何特殊的事件实现,也就是说,他们只是使用一个普通的底层字段委托)...您可以暂时删除然后在序列化时重新添加事件订阅。随机谷歌参考: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的对象,并确保忽略委托类型的字段。