1、下載flatbuffers
從https://github.com/google/flatbuffers地址下載flatbuffers-master.zip文件。
2、編譯flatbuffers
解壓flatbuffers-master.zip文件文件,使用VS2010打開flatbuffers-master\build\VS2010\FlatBuffers.sln文件進行編譯。編譯后生成的文件如下:
1. flatc.exe - 編譯schema文件、生成代碼
2. flatsamplebinary.exe - 測試程序,將二進制轉換為C++對象
3. flatsampletext.exe - 測試程序,將json轉換為C++對象
4. flattests.exe - 測試flatbuffers
3、json與C++對象相互轉換
flatbuffers的測試程序中有json與c++對象相互轉換的例子,但是不夠方便,在這里我們可以封裝一下。
FlatBufferJsonFactory.h
#include "TypeBind.h" // 詳見我的另一篇博文"C++模板之類型與數據綁定" class FlatBufferJsonFactory { private: struct ParserInfo { ParserInfo(const std::string& _path) : path(_path), parser(nullptr) {} std::string path; // fbs文件路徑 flatbuffers::Parser* parser; // flatbuffers解析器 }; public: // 將json字符串轉換為了對象緩沖區 template<class T> std::string parserJson(const std::string& s) { const ParserInfo& info = getParser<T>(); info.parser->Parse(s.c_str(), nullptr); const size_t size = info.parser->builder_.GetSize(); const char* ptr = (const char*)info.parser->builder_.GetBufferPointer(); std::string buffer(ptr, ptr + size); return buffer; } // 將對象緩存轉換為json字符串 template<class T> std::string toJson(const void* buffer) { std::string json; const ParserInfo& info = getParser<T>(); flatbuffers::GeneratorOptions options; options.strict_json = true; GenerateText(*info.parser, buffer, options, &json); return json; } // 注冊 template<class T> void Register(const std::string& path) { ParserInfo info(path); m_map.bind<T>(info); } template<class T> const ParserInfo& getParser() { ParserInfo& info = m_map.find<T>(); if (!info.parser) { std::string buf; flatbuffers::LoadFile(info.path.c_str(), false, &buf); flatbuffers::Parser* parser = new flatbuffers::Parser(); bool ret = parser->Parse(buf.c_str(), nullptr); info.parser = parser; } return info; } static FlatBufferJsonFactory& Instance() { static FlatBufferJsonFactory* instance = nullptr; if (!instance) instance = new FlatBufferJsonFactory(); return *instance; } private: FlatBufferJsonFactory() {} TypeBind<ParserInfo> m_map; };
編寫test.fbs文件
namespace TestApp; struct KV { key: ulong; value: double; } table TestObj { id: ulong; name: string; flag: ubyte = 0; list: [ulong]; kv: KV; } root_type TestObj;
然后利用"flatc.exe"生成.h文件,並使用此.h文件
int _tmain(int argc, _TCHAR* argv[]) { FlatBufferBuilder fbb; // 設置數據 std::vector<uint64_t> v = { 1, 2, 3, 4, 5 }; auto kv = KV(1, 1.0); auto name = fbb.CreateString("123"); auto vec = fbb.CreateVector(v); TestObjBuilder builder(fbb); builder.add_id(100); builder.add_name(name); builder.add_flag(1); builder.add_list(vec); builder.add_kv(&kv); fbb.Finish(builder.Finish()); // 注冊 FlatBufferJsonFactory::Instance().Register<TestApp::TestObj>("E:\\c++\\use_flat_buffers\\use_flat_buffers\\test.fbs"); std::string json = FlatBufferJsonFactory::Instance().toJson<TestApp::TestObj>(fbb.GetBufferPointer()); std::string buffer = FlatBufferJsonFactory::Instance().parserJson<TestApp::TestObj>(json); const TestApp::TestObj* obj = GetTestObj(buffer.c_str()); const char* names = obj->name()->c_str(); return 0; }