4

我有一个 WCF 服务处理大量请求(每秒数千个)。每个请求都包含对象,因此它们在反序列化期间构建在 DataContractSerializer 中。我的服务处理这些消息,它们被 .net 垃圾收集器清理。

问题是垃圾收集给我的服务带来了问题(请求有时会比应有的时间长 100 多毫秒)。我需要尽量减少它们。所以我正在寻找一种使用对象池的方法。换句话说,我希望数据契约序列化程序从我的对象池中获取一个对象(而不是通过 GetUninitializedObject 获取一个),然后当我处理完消息后,我会将其释放回池中进行清理和重用,从而避免每秒数千次内存分配。

我已经看到使用 protobuf-net 是可能的(使用 protobuf-net,是否可以在不分配内存的情况下反序列化消息?)实际上我在其他地方使用 protobuf,但对于这种特殊情况,这不是一个选项

4

1 回答 1

1

DataContractSerializer密封,无法更新。所以不幸的是,您将无法删除它对FormatterServices.GetUninitializedObject.

相反,您需要做的是创建您自己的从XmlObjectSerializer继承的序列化程序,以便您可以完全控制实例的创建。

下一步是创建DataContractSerializerOperationBehavior并重写CreateSerializer方法以返回您的自定义序列化程序。

最后要做的是从端点中删除默认的 DataContractSerializerOperationBehavior 并将其替换为实现自定义序列化程序的自定义项。Carlos Figueira 在他的博客上有一篇文章准确地展示了如何做到这一点(转到名为“真实世界场景:使用新的序列化程序”的部分)。

于 2012-08-24T05:04:33.830 回答