gpt4 book ai didi

c++ - 使用 FlatBuffers 序列化对象 vector

转载 作者:行者123 更新时间:2023-11-30 05:05:12 28 4
gpt4 key购买 nike

我有一个对象 vector ,我们称它们为 Plumbus,我想用 FlatBuffers 对其进行序列化。这个例子的模式是

namespace rpc;

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

table PlumbusesTable {
plumbuses:[Plumbus];
}

root_type PlumbusesTable;

因为根类型不能是 vector 。打电话flatc --cpp在此文件上生成 plumbus_generated.h具有 CreatePlumbusesTableDirect 等功能.

生成的GeneratePlumbusesTableDirect函数需要一个参数 const std::vector<const Plumbus *> *plumbuses .我的想法是简单地获取 vector 中对象的地址 pbs并将它们存储在另一个 vector 中,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

为什么会出错?

最佳答案

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

因此要么使用最新的 FlatBuffers,要么使用没有 Direct 的版本:CreatePlumbusesTable。然后您自己调用 CreateVectorOfStructs

关于c++ - 使用 FlatBuffers 序列化对象 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48520513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com