Сериализация вектора объектов с помощью FlatBuffers

У меня есть вектор объектов, назовем их Плюмбусами, которые я хочу сериализовать с помощью FlatBuffers. Моя схема для этого примера будет

namespace rpc;

struct Plumbus
{
  dinglebopBatch:int;
  fleeb:double;
}

table PlumbusesTable {
  plumbuses:[Plumbus];
}

root_type PlumbusesTable;

поскольку корневой тип не может быть вектором. Вызов flatc --cpp для этого файла генерирует plumbus_generated.h с такими функциями, как CreatePlumbusesTableDirect.

Сгенерированная функция GeneratePlumbusesTableDirect ожидает аргумент const std::vector<const Plumbus *> *plumbuses. Моя идея заключалась в том, чтобы просто взять адреса объектов в векторе pbs и сохранить их в другом векторе, pbPtrs. Поскольку буфер создается и отправляется до того, как pbs выйдет из области видимости, я подумал, что это не будет проблемой.

#include <vector>
#include <iostream>

#include "plumbus_generated.h"


void send_plumbus(std::vector<rpc::Plumbus> pbs) {
    std::vector<const rpc::Plumbus *> pbPtrs;
    pbPtrs.push_back(&(pbs[0]));
    pbPtrs.push_back(&(pbs[1]));

    flatbuffers::FlatBufferBuilder buf(1024);
    auto msg = CreatePlumbusesTableDirect(buf, &pbPtrs);
    buf.Finish(msg);

    void *msg_buf = buf.GetBufferPointer();

    // here, I'd normally send the data through a socket

    const rpc::PlumbusesTable *pbt = rpc::GetPlumbusesTable(msg_buf);
    auto *pbPtrs_ = pbt->plumbuses();
    for (const auto pbPtr_ : *pbPtrs_) {
        std::cout << "dinglebopBatch = " << pbPtr_->dinglebopBatch() << ", fleeb = " << pbPtr_->fleeb() << std::endl;
    }

}

int main(int argc, char** argv) {
    rpc::Plumbus pb1(1, 2.0);
    rpc::Plumbus pb2(3, 4.0);
    std::vector<rpc::Plumbus> pbs = { pb1, pb2 };
    send_plumbus(pbs);
}

Запустив это вместо 1, 2.0, 3 и 4.0, я получаю

$ ./example 
dinglebopBatch = 13466704, fleeb = 6.65344e-317
dinglebopBatch = 0, fleeb = 5.14322e-321

Почему все идет не так?


person nnnmmm    schedule 30.01.2018    source источник


Ответы (1)


Похоже, это связано с недавно исправленной ошибкой: https://github.com/google/flatbuffers/commit/fee9afd80b6358a63b92b6991d858604da524e2b

Так что либо работайте с самыми последними FlatBuffers, либо используйте версию без Direct: CreatePlumbusesTable. Затем вы сами звоните CreateVectorOfStructs.

person Aardappel    schedule 30.01.2018