如果我使用这些类型在WPF中显示数据,我无法序列化通过WCF mex端点获取的类型。
这是因为自动生成的类型确实实现了INotifyPropertyChanged接口,并且因为WPF绑定订阅了它。
执行此操作的常规方法是将[field:NonSerialized]添加到事件声明中。我不想这样做,因为这些类是自动生成的。
我也不想切换到DataContractSerializer,主要是因为我发现在所有其他情况下我使用的BinaryFormatter相当方便。
我想要做的是找到一个字段,在该字段中存储事件数据并在序列化开始使用反射之前将其标记为NonSerialized。
以下是我的问题:
答案 0 :(得分:0)
以下是我的一些想法。
使用CodeDom或ILGenerator在序列化时创建动态代理类(未实现INotifyPropertyChanged)。然后使用类似AutoMapper的东西将原始对象图映射到这些代理类上。
如果您唯一真正的问题是事件订阅...并且您知道这些类是自动生成的(因此他们没有任何特殊的事件实现,也就是说,他们只是使用一个普通的底层字段委托)...您可以暂时删除然后在序列化时重新添加事件订阅。随机谷歌参考:How to get a delegate object from an EventInfo?。基本上,您可以获取所有当前事件订阅,擦除委托,然后重新添加订阅.....或者您可以将底层委托字段置空,然后在序列化完成后重新设置它。
如果您不太关心性能,可以使用ISerializationSurrogate http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializationsurrogate.getobjectdata.aspx 它反映了所有FieldInfos的对象,并确保忽略委托类型的字段。