3

我也在這裏尋找其他一些主題,但我沒有找到解決我的問題。強制WCF在反序列化期間使用現有的緩衝區?

想象一下:
我有一個非常簡單的ServiceContract不同的OperationContracts。其中一個OperationContracts是一個簡單的用例「下載數據傳輸對象」。

的服務看起來像:

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

類DTO的樣子:

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

    [DataMember] 
    public byte[] Data; 
} 

當然,這是非常簡單的,它工作正常,但我需要我自己來分配DTO的byte[]

我的代碼是框架組件的一部分,它在大規模內存限制下並行工作。我不希望WCF分配所有的字節[],我不想讓ManagedHeap再次釋放它們。我需要共享和重用所有並行的現有緩衝區。

所以當我完成我的序列化時,我將在服務器端重新使用緩衝區。 在客戶端,我希望WCF讀取我的緩衝區

我試着用自己的XmlObjectSerialiers和自己的OperationBehaviors一些解決方案,但它沒有工作。

有沒有人有任何其他想法?

+0

爲什麼你希望你的數據作爲成員包含在datacontract中?如果你不想把它發送給客戶端? – Peter

+0

當然我想發送數據給客戶端。但是我想讓wcf在我已經分配的字節[]中傳入數據。 –

回答

0

更新:

我發現使用自己的串行第一工作液:XmlObjectSerializer,一個自己IContractBehavior和自己DataContractSerializerOperationBehavior。

雖然反序列化我用下面的代碼片段期間XmlDictionaryReader閱讀:

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

這工作,但它仍然比DataContractSerializer的慢一點。

還有其他的選擇嗎?

注意:我只是想轉移已經存在的二進制序列化數據!

相關問題