2012-08-10 58 views
4

我有一個處理大量請求(每秒數千次)的WCF服務。每個請求都包含對象,因此它們在反序列化期間內置於DataContractSerializer內部。我的服務處理消息,並由.net垃圾回收器清理。wcf反序列化無內存分配

的問題是,垃圾收集正在給我的服務問題(請求偶爾服用超過100毫秒比他們應該更長)。我需要儘量減少它們。所以我正在尋找一種使用對象池的方式。換句話說,我希望數據協定序列化程序從我的對象池中獲取一個對象(而不是通過GetUninitializedObject獲取一個對象),然後當我完成處理該消息時,我會將其釋放回池以供清洗&重用,從而避免每秒數千次的內存分配。

我已經看到了這是可能的protobuf網(Using protobuf-net, is it possible to deserialize a message without allocating memory?),事實上我使用protobuf的其他地方,但對於這種特殊的情況,是不是一種選擇

+0

你在尋找的不是一個對象池,而是一個緩存。 – DarthVader 2012-08-10 16:23:09

回答

1

DataContractSerializer是密封的,不能被更新。所以不幸的是,你不能刪除它的電話FormatterServices.GetUninitializedObject

你將要做的反而是創建自己的串行從XmlObjectSerializer繼承,這樣就可以完全控制實例的創建。

下一步是創建一個DataContractSerializerOperationBehavior並覆蓋CreateSerializer方法以返回您的定製序列化程序。

最後要做的就是從端點刪除默認DataContractSerializerOperationBehavior,並實現自定義序列化的自定義更換。 Carlos Figueira has a post on his blog showing exactly how to do this(轉到名爲真實世界場景的部分:使用新的序列化程序)。

+0

這就是我所害怕的。謝謝! – fatweasel 2012-09-18 19:01:38