使用flatbuffers从C#序列化到本地内存缓冲区

问题描述:

C#中的flatbuffers可能将对象序列化到本机(非管理型)内存缓冲区中吗? 所以我想要做的步骤:使用flatbuffers从C#序列化到本地内存缓冲区

  1. 从本机内存分配本机内存缓冲区
  2. C#创建对象,并将它们序列到分配的缓冲区
  3. 发送该内存缓冲区C++反序列化

我正在考虑C#中的一些自定义内存缓冲区分配器,或者将C#内存缓冲区所有权转移到C++的某种方式。

一般来说,我想避免从C#向C++发送数据时反复拷贝内存,反之亦然。我想要这个内存缓冲区在C#和C++之间共享。

我该怎么做?

+0

任何人都可以解释downvotes和关闭投票吗? – Max

+0

你可以固定c#内存并将其地址传递给C函数https://*.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

号,当前FlatBuffers实现是硬编码写入到正规的字节数组。之后您可以将此阵列复制到本机内存,或者像@ pm100所说的那样,将其固定。

FlatBuffers中的所有序列化都经历了一个名为ByteBuffer的抽象,所以如果您为本机内存创建了一个实现,它可以相对容易地直接使用。

是的,如果你使用C++/CLI。基本数据类型如bool,32位int,short等是相同的。对于其他类型检查出来msclr :: interop :: marshal_as <>。

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

+0

谢谢,但这不是我问的。我的问题是关于使用flatbuffers库和关于正常的C++。编组确实做了记忆复制,这正是我想要避免的。 – Max