2017-07-07 79 views
-1

C#中的flatbuffers可能將對象序列化到本機(非管理型)內存緩衝區中嗎? 所以我想要做的步驟:使用flatbuffers從C#序列化到本地內存緩衝區

  1. 從本機內存分配本機內存緩衝區
  2. C#創建對象,並將它們序列到分配的緩衝區
  3. 發送該內存緩衝區C++反序列化

我正在考慮C#中的一些自定義內存緩衝區分配器,或者將C#內存緩衝區所有權轉移到C++的某種方式。

一般來說,我想避免從C#向C++發送數據時反覆拷貝內存,反之亦然。我想要這個內存緩衝區在C#和C++之間共享。

我該怎麼做?

+0

任何人都可以解釋downvotes和關閉投票嗎? – Max

+0

你可以固定c#內存並將其地址傳遞給C函數https://stackoverflow.com/questions/5143349/c-sharp-how-can-i-pin-an-object-in-memory-without-marshalling-該對象和這裏https://manski.net/2012/06/pinvoke-tutorial-pinning-part-4/ – pm100

回答

0

號,當前FlatBuffers實現是硬編碼寫入到正規的字節數組。之後您可以將此陣列複製到本機內存,或者像@ pm100所說的那樣,將其固定。

FlatBuffers中的所有序列化都經歷了一個名爲ByteBuffer的抽象,所以如果您爲本機內存創建了一個實現,它可以相對容易地直接使用。

0

是的,如果你使用C++/CLI。基本數據類型如bool,32位int,short等是相同的。對於其他類型檢查出來msclr :: interop :: marshal_as <>。

類似的帖子:C++/CLI Converting from System::String^ to std::string

+0

謝謝,但這不是我問的。我的問題是關於使用flatbuffers庫和關於正常的C++。編組確實做了記憶複製,這正是我想要避免的。 – Max