當我訪問一個文件,以獲取已保存的對象我目前經過這條路:有沒有辦法將本地數組轉換爲託管數據而不復制數據?
- 讀取序列化流進本地緩衝
- 複製本地緩存到託管緩存
- 反序列化(我使用netserializer)
複製不是一個大問題,但它似乎沒有必要,所以我想消除它,如果可能的話。
我想我發現了一個聰明的方式通過具有該流讀取功能接受字符*(* allocFunc)(ItemLengthType)的函數指針,然後直接將數據讀入所述釘扎管理的陣列,這樣做:
array<Byte>^ serBuf;
itemStream->ReadItem(i, [=](uint32_t len){
serBuf = gcnew array<Byte>(len);
pin_ptr<Byte> pData = &serBuf[0];
return reinterpret_cast<char*>(pData);
});
但史詩般的失敗,無法捕捉到lambda函數中的託管對象,甚至無法在託管類中創建lambda函數。
唯一的其他替代我看是把我流類爲管理一個並讓它產生一個管理陣列,但這個類是從其他項目,我在許多其他非CLR相關的解決方案使用。我也不打算創建該項目的半管理分支,太費心了。
有沒有其他辦法,我避免了複製步驟?