4

非常に多くのリクエスト (毎秒数千) を処理する WCF サービスがあります。各リクエストにはオブジェクトが含まれているため、逆シリアル化中に DataContractSerializer 内に構築されます。私のサービスはメッセージを処理し、.net ガベージ コレクターによってクリーンアップされます。

問題は、ガベージ コレクションがサービスに問題を引き起こしていることです (要求が必要以上に 100 ミリ秒以上かかる場合があります)。それらを最小限に抑える必要があります。そこで、オブジェクト プーリングを使用する方法を探しています。言い換えれば、データ コントラクト シリアライザーが (GetUninitializedObject を介してオブジェクトを取得するのではなく) オブジェクト プールからオブジェクトを取得するようにし、メッセージの処理が完了したら、クリーニングと再利用のためにプールに解放します。これにより、1 秒間に数千回のメモリ割り当てを回避できます。

これは protobuf-net で可能であることがわかりました ( Using protobuf-net, is it possible to deserialize a message without allocating memory? ) 実際、私は他の場所で protobuf を使用していますが、この特定の状況ではオプションではありません

4

1 に答える 1

1

DataContractSerializer封印されており、更新できません。残念ながら、 への呼び出しを削除することはできませんFormatterServices.GetUninitializedObject

代わりに、 XmlObjectSerializerから継承する独自のシリアライザーを作成して、インスタンスの作成を完全に制御できるようにする必要があります。

次の手順では、DataContractSerializerOperationBehaviorを作成し、メソッドをオーバーライドしてCreateSerializer、カスタマイズしたシリアライザーを返します。

最後に、デフォルトの DataContractSerializerOperationBehavior をエンドポイントから削除し、カスタム シリアライザーを実装するカスタム ビヘイビアーに置き換えます。Carlos Figueira は彼のブログに投稿しており、これを行う方法を正確に示しています(「実世界のシナリオ: 新しいシリアライザーを使用する」セクションに移動してください)。

于 2012-08-24T05:04:33.830 に答える