FlatBuffers入門


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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM