【问题标题】:wcf deserializing without memory allocations没有内存分配的 wcf 反序列化
【发布时间】:2012-08-10 16:20:00
【问题描述】:

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

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

我已经看到 protobuf-net (Using protobuf-net, is it possible to deserialize a message without allocating memory?) 可以做到这一点,实际上我在其他地方使用了 protobuf,但对于这种特殊情况,这不是一个选项

【问题讨论】:

  • 你要找的不是对象池而是缓存。

标签: wcf garbage-collection datacontractserializer


【解决方案1】:

DataContractSerializer 已密封,无法更新。所以很遗憾,您将无法删除它对FormatterServices.GetUninitializedObject 的调用。

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

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

最后要做的是从端点中删除默认的 DataContractSerializerOperationBehavior 并将其替换为实现自定义序列化程序的自定义。 Carlos Figueira has a post on his blog showing exactly how to do this(转到名为“真实世界场景:使用新的序列化程序”的部分)。

【讨论】:

  • 这就是我害怕的。谢谢!
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 2012-03-10
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多