FlatBuffers 的 直接上手C++示例

1、生成scheme文件,即fbs 文件,保存为 flatbuffs_for_zmq.fbs,内容如下

table TransMsg {
    type:int;
    content:string;
}

root_type TransMsg;

2、编译scheme文件

flatc.exe --cpp flatbuffs_for_zmq.fbs

3、编译生成后的文件flatbuffs_for_zmq_generated.h,内容如下

// automatically generated by the FlatBuffers compiler, do not modify

#ifndef FLATBUFFERS_GENERATED_FLATBUFFSFORZMQ_H_
#define FLATBUFFERS_GENERATED_FLATBUFFSFORZMQ_H_

#include "flatbuffers/flatbuffers.h"



struct TransMsg;

struct TransMsg FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table {
  enum {
    VT_TYPE = 4,
    VT_CONTENT = 6
  };
  int32_t type() const { return GetField<int32_t>(VT_TYPE, 0); }
  const flatbuffers::String *content() const { return GetPointer<const flatbuffers::String *>(VT_CONTENT); }
  bool Verify(flatbuffers::Verifier &verifier) const {
    return VerifyTableStart(verifier) &&
           VerifyField<int32_t>(verifier, VT_TYPE) &&
           VerifyField<flatbuffers::uoffset_t>(verifier, VT_CONTENT) &&
           verifier.Verify(content()) &&
           verifier.EndTable();
  }
};

struct TransMsgBuilder {
  flatbuffers::FlatBufferBuilder &fbb_;
  flatbuffers::uoffset_t start_;
  void add_type(int32_t type) { fbb_.AddElement<int32_t>(TransMsg::VT_TYPE, type, 0); }
  void add_content(flatbuffers::Offset<flatbuffers::String> content) { fbb_.AddOffset(TransMsg::VT_CONTENT, content); }
  TransMsgBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); }
  TransMsgBuilder &operator=(const TransMsgBuilder &);
  flatbuffers::Offset<TransMsg> Finish() {
    auto o = flatbuffers::Offset<TransMsg>(fbb_.EndTable(start_, 2));
    return o;
  }
};

inline flatbuffers::Offset<TransMsg> CreateTransMsg(flatbuffers::FlatBufferBuilder &_fbb,
   int32_t type = 0,
   flatbuffers::Offset<flatbuffers::String> content = 0) {
  TransMsgBuilder builder_(_fbb);
  builder_.add_content(content);
  builder_.add_type(type);
  return builder_.Finish();
}

inline const TransMsg *GetTransMsg(const void *buf) { return flatbuffers::GetRoot<TransMsg>(buf); }

inline bool VerifyTransMsgBuffer(flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer<TransMsg>(); }

inline void FinishTransMsgBuffer(flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset<TransMsg> root) { fbb.Finish(root); }


#endif  // FLATBUFFERS_GENERATED_FLATBUFFSFORZMQ_H_

4、序列化和反序列化

#include <stdio.h>

/*序列化*/
char* generateBuffer()
{
    int len = 0;
    {
        int ret = 0;
        char* p = NULL;
        int zmqRet = 0;
        flatbuffers::FlatBufferBuilder builder;
        flatbuffers::Offset<flatbuffers::String> content;
        flatbuffers::Offset<TransMsg> zmqData;

        char buffer[128] = {"Hello world!"};

        builder.Clear();

        content = builder.CreateString(buffer, strlen("Hello world!")+1);

        TransMsgBuilder msgData(builder);
        msgData.add_type(1001);
        msgData.add_content(content);
        zmqData = msgData.Finish();
        builder.Finish(zmqData);

        len = builder.GetSize();
        p = new char[len];
        memcpy(p, builder.GetBufferPointer(), builder.GetSize());
    }
}

/*反序列化*/
void decodeBuffer()
{
    const TransMsg* pTransMsg = GetTransMsg(p);
    printf("type is %d, msg is %s\n", pTransMsg->type(),                 pTransMsg->content()->c_str());
}


int main(int argc, char* argv[])
{
    char* p = NULL;
    p = generateBuffer;
    decodeBuffer();

    delete p;

}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值