【问题标题】:flatbuffers::Table* to buffer_pointerflatbuffers::Table* 到 buffer_pointer
【发布时间】:2019-07-16 05:15:02
【问题描述】:

考虑这种情况。 我正在使用CreateXXX 生成的代码创建一个结构(flatbuffers::Table)。这会在 FlatBuffer 缓冲区上创建结构并给我偏移量。 然后我可以用GetBufferPointer() 获取内存块并传输它。 相反,如果我得到一个内存块,我可以使用 GetXXX 从中获取我的 struct(flatbuffers::Table)。

但是我得到这个结构后,如果我需要再次序列化它,我该怎么做呢?序列化后,我应该能够像以前一样传输该数据并对该数据执行 GetXXX。

flatbuffers::Parser parser;
parser.Parse(schema.c_str());
parser.SetRootType("license");
parser.Parse(j.c_str());

auto* buf = parser.builder_.GetBufferPointer();
auto li = flatbuffers::GetRoot<license>(buf);

std::cout << "ID: " << li->id()->c_str() << " Rand: " << li->rand()->c_str() << " Secret: " << li->secret()->c_str() << std::endl;

uint8_t* buf2 = ????????????
auto li2 = flatbuffers::GetRoot<license>(buf2);

std::cout << "ID: " << li2->id()->c_str() << " Rand: " << li2->rand()->c_str() << " Secret: " << li2->secret()->c_str() << std::endl;

【问题讨论】:

    标签: c++ flatbuffers


    【解决方案1】:

    显而易见的答案是保留原始缓冲区指针(和大小)。然后你可以通过写出现有的缓冲区来“重新序列化”它。

    如果您真的必须只使用根(在您的示例中为li),则有一个函数GetBufferStartFromRootPointer

    【讨论】:

    • 对不起,我不清楚。要求是通过JNI将buf2传递给Java,并在Java端反序列化li2。
    • 我还需要知道,1. GetBufferStartFromRootPointer 是否也对内部表进行序列化? 2.如何获取返回缓冲区的长度?
    • 您的问题并不清楚。这也与 FlatBuffers 无关,因为对于任何字节缓冲区都是一样的。你的问题应该被标记:c++ java jni。我不是 Java 专家,但我认为 ByteBuffer 的一个子类可以让您对 C++ 拥有的内存进行内存映射。 GetBufferStartFromRootPointer 不序列化任何东西,它只是一种从根指针查找缓冲区开始的方法,即与 GetRoot 相反(它也不(反)序列化任何东西)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 2016-09-26
    相关资源
    最近更新 更多