3

ここで他のトピックも探しましたが、問題の解決策はまだ見つかりませんでした。


次のことをServiceContract想像してみてくださいOperationContracts。これらの 1 つOperationContractsは、「データ転送オブジェクトをダウンロードする」という単純な使用例です。

サービスは次のようになります。

...
[OperationContract]
DTO Download(strind Id)
...

クラス DTO は次のようになります。

[DataContract]
public class DTO
{
     [DataMember]
     public string Id;

     [DataMember]
     public byte[] Data;
}

もちろん非常にシンプルで問題なく動作しますが、byte[]自分で DTO を割り当てる必要があります。

マイ コードはフレームワーク コンポーネントの一部であり、大規模なメモリ制限の下で並行して動作しています。WCF にすべての byte[] を割り当ててほしくないし、ManagedHeap にそれらすべての割り当てを再度解除させたくありません。すべての並列既存バッファーを共有して再利用する必要があります。

したがって、シリアル化が完了したら、サーバー側でバッファーを再利用します。クライアント側では、 WCF にバッファを読み込ませたいのです!

XmlObjectSerialiersownと ownでいくつかの解決策を試しOperationBehaviorsましたが、まだうまくいきませんでした。

他のアイデアはありますか?

4

1 に答える 1

0

アップデート:

独自の Serializer:XmlObjectSerializer、独自の IContractBehavior、および独自の DataContractSerializerOperationBehavior を使用して、最初の実用的なソリューションを見つけました。

逆シリアル化中に XmlDictionaryReader から読み取るときに、次のスニペットを使用します。

public bool DeserializeFrom(XmlDictionaryReader source)
{
     ...
     readBytes = source.ReadElementContentAsBase64(MyOwnAlreadyAllocatedBuffer, offset, toRead);
     ...
}

これは機能しますが、それでも DataContractSerializer よりも少し遅くなります。

他のオプションはありますか?

注意: 既にバイナリ化されたデータを転送したいだけです!

于 2012-10-31T14:35:49.420 に答える