我有下一个问题:我有一个大的对象图被二进制序列化,许多字段和事件标记为[NonSerializable]或[field:NonSerializable]。
问题是,我仍然不知道从哪里或为什么(复杂的调用树),一些动作或Func(这是标记为[NonSerializable]和lambdas分配的字段)被序列化,你可以在创建的二进制文件中看到。
那么,我可以使用什么技术来检测"序列化泄漏":那些事件被钩住的代码成员?
我将在这里使用反射,将每个属性/字段转换为相关类型(考虑列表和其他泛型),试图构建我们期望在模型中的类型的完整列表。从那里,获取EventHandlerList或Delegate类型的所有字段(考虑基类和子类)。现在检查这些字段中是否有任何字段没有标记NonSerializedAttribute以忽略序列化。
或者更简单:使用不永远写委托的序列化器;任何XmlSerializer, JavascriptSerializer, DataContractSerializer,或者如果你想直接二进制protobuf-net。或者任何不是BinaryFormatter或NetDataContractSerializer的东西