zoukankan      html  css  js  c++  java
  • flatbuffers 使用问题记录

    1.  命名空间的问题
    -----------------------------
    
    namespace 1.0.3 版本包含文件类型前面不需要加命名空间,但是1.1.0 中包含需要在类型前加命名空间
    
    include必须放在namespace前面
    例如:
    include “aa.fbs”
    namespace IM.test;
    
    
    
    foo.fbc
    namespace foo;
    struct Foo { f: uint; }
    
    bar.fbc
    include "foo.fbc";
    namespace bar;
    struct Bar { foo: Foo; }
    
    flatc -c bar.fbc will fail with bar.fbc:3:0: error: structs_ may contain only scalar or struct fields
    
    修改方式:
    struct Bar { foo: Foo; } ->  struct Bar { foo: foo.Foo; }  或者 将 struct 修改成 table
    
    
    
    struct UserInfo{
            user_id:uint;
                        name:string
    }
    
    error: structs_ may contain only scalar or struct fields
    
    因为 struct 结构中不能使用 string 类型,修改成  table 即可

    2. struct 和 table的区别 ------------------------------ http://www.coder4.com/archives/4386 基本类型: 8 bit: byte ubyte bool 16 bit: short ushort 32 bit: int uint float 64 bit: long ulong double 复杂类型: 数组 (用中括号表示 [type]). 不支持嵌套数组,可以用table实现 字符串 string, 支持 UTF-8 或者 7-bit ASCII. 对于其他编码可以用数组 [byte]或者[ubyte]表示。 Struct 只支持基本类型或者嵌套Struct Table 类似Struct,但是可以支持任何类型。 3. roottype的问题及多个table的解决方式 ------------------------------------------ https://github.com/google/flatbuffers/issues/65 Why the need for a Root 1) a commit was pushed yesterday that adds GetRootAs functions for all tables, not just the root_type. 2) generally no. this is a strongly types system, meaning you need to know the kind of buffer you're dealing with. If you want to use this in a context where you want to have multiple different root types, you have these options: a) make your root type a table that contains a union of all possible sub-roots. b) prefix flatbuffers with your own file header c) use flatbuffer's built-in file indentification feature, which hasn't been ported to Java yet. I'll get to that. 3) That's a bug, the 1 should actually read: Any.Monster. I'll fix that. 多个消息一个文件中,但是root_type 只能有一个,解决方式如下: namespace TestApp; union Msg {TestObj, Hello} struct KV { key: ulong; value: double; } table TestObj { id:ulong; name:string; flag:ubyte = 0; list:[ulong]; kv:KV; } table Hello { id:uint; name:string; } table RootMsg{ any:Msg; } root_type RootMsg;

    具体样例可以参见:https://github.com/DavadDi/study_example/tree/master/flatbuffers/multi_table

    4. enum不生成name的前缀
    ---------------------------

    flatc -c --no-prefix -b aa.fbs

    5. 其他问题
    ----------------------------

    enum的默认值只能从0开始

    由于table中的字段全部为可选,因此所有返回指针的地方都必须判断是否为空指针
    #define STR(ptr) (ptr!=nullptr)?ptr->c_str():""
    std::string = STR(user_info->user_name());
  • 相关阅读:
    Python requests“Max retries exceeded with url” error
    命令行链接mongo、redis、mysql
    python 删除字典某个key(键)及对应值
    python标准模块(二)
    python标准模块(一)
    格式化输出
    LeetCode----1. Two Sum
    文件操作(初阶)
    python函数基础
    python3内置函数
  • 原文地址:https://www.cnblogs.com/davad/p/4901794.html
Copyright © 2011-2022 走看看