我有一个处理大量请求的WCF服务(每秒数千个)。每个请求都包含对象,因此在反序列化期间它们会在DataContractSerializer中构建。我的服务处理消息,然后由.net垃圾收集器清理它们。
问题是垃圾收集导致我的服务出现问题(请求偶尔会比他们应该的时间长100多毫秒)。我需要尽量减少它们。所以我正在寻找一种使用对象池的方法。换句话说,我希望数据契约序列化程序从我的对象池中获取一个对象(而不是通过GetUninitializedObject获取一个对象),然后当我完成处理该消息时,我会将其释放回池中以进行清理。重用,从而避免数秒内存分配。
我已经看到使用protobuf-net(Using protobuf-net, is it possible to deserialize a message without allocating memory?)这是可能的,事实上我在其他地方使用protobuf,但对于这种特殊情况不是一种选择
答案 0 :(得分:1)
DataContractSerializer
已封存且无法更新。很遗憾,你无法删除它对FormatterServices.GetUninitializedObject
的号召。
您需要做的是创建自己继承自XmlObjectSerializer的序列化程序,以便您可以完全控制实例创建。
下一步是创建DataContractSerializerOperationBehavior并覆盖CreateSerializer
方法以返回自定义序列化程序。
最后要做的是从端点中删除默认的DataContractSerializerOperationBehavior,并将其替换为实现自定义序列化程序的自定义DataTontractSerializerOperationBehavior。 Carlos Figueira has a post on his blog showing exactly how to do this(转到名为Real world scenario:使用新的序列化程序的部分)。