【问题标题】:Serializing a vector of objects with FlatBuffers使用 FlatBuffers 序列化对象向量
【发布时间】:2018-01-30 11:38:05
【问题描述】:

我有一个对象向量,我们称它们为 Plumbuses,我想用 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

为什么会出错?

【问题讨论】:

    标签: c++ flatbuffers


    【解决方案1】:

    这看起来与最近修复的错误有关:https://github.com/google/flatbuffers/commit/fee9afd80b6358a63b92b6991d858604da524e2b

    所以要么使用最新的 FlatBuffers,要么使用没有 Direct 的版本:CreatePlumbusesTable。然后你自己打电话给CreateVectorOfStructs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2018-06-21
      相关资源
      最近更新 更多