强制WCF在反序列化期间使用现有缓冲区?

时间:2012-10-31 13:07:42

标签: wcf serialization deserialization datacontractserializer xmlserializer

我也在这里寻找其他一些主题,但我还没有找到解决问题的方法。

想象一下:
我有一个非常简单ServiceContractOperationContracts不同。其中一个OperationContracts是一个简单的用例“下载数据传输对象”。

服务看起来像:

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

DTO类看起来像:

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

     [DataMember]
     public byte[] Data;
}

当然它非常简单并且工作正常,但我需要自己在DTO中分配byte[]

我的代码是框架组件的一部分,它在大量内存限制下并行工作。我不希望WCF分配所有byte [],我不希望ManagedHeap再次释放它们。我需要共享和重用所有并行的现有缓冲区。

因此,当我完成序列化后,我将在服务器端重用缓冲区。 在客户端,我希望WCF读入我的缓冲区

我尝试了一些拥有XmlObjectSerialiers和拥有OperationBehaviors的解决方案,但它还没有用。

有没有人有其他想法?

1 个答案:

答案 0 :(得分:0)

更新:

我找到了第一个使用自己的Serializer的工作解决方案:XmlObjectSerializer,一个自己的IContractBehavior和一个自己的DataContractSerializerOperationBehavior。

在反序列化期间从XmlDictionaryReader读取时,我使用以下代码段:

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

这可行,但它仍然比DataContractSerializer慢一点。

还有其他选择吗?

注意:我只想传输已经二进制的序列化数据!