如何在Flatbuffers中序列化结构的并集

时间:2018-07-10 19:17:24

标签: flatbuffers

假设我有以下Flatbuffers模式文件:

union WeaponProperties {
    sword:  PSword,
    axe:    PAxe,
    mace:   PMace,
}
struct PSword { length: float32; straight: bool; }
struct PAxe   { bearded: bool; }
struct PMace  { hardness: int8; }

table Weapon {
    name:      string;
    mindamage: int32;
    maxdamage: int32;
    swingtime: float32;
    weight:    float32;
    properties: WeaponProperties;
}
root_type Weapon;

在此架构文件上运行flatc编译器后,生成的weapon_generated.h文件将大致具有以下结构:

enum WeaponProperties {
  WeaponProperties_NONE = 0,
  WeaponProperties_sword = 1,
  WeaponProperties_axe  = 2,
  WeaponProperties_mace = 3,
  ...
};
struct PSword { ... }
struct PAxe   { ... }
struct PMace  { ... }

class Weapon { ... }
class WeaponBuilder { ... }

inline flatbuffers::Offset<Weapon> CreateWeaponDirect(
    flatbuffers::FlatBufferBuilder &_fbb,
    const char *name = nullptr,
    int32_t mindamage = 0,
    int32_t maxdamage = 0,
    float swingtime = 0.0f,
    float weight = 0.0f,
    WeaponProperties properties_type = WeaponProperties_NONE,
    flatbuffers::Offset<void> properties = 0) { ... }

值得注意的是,为了使用CreateWeaponDirect()WeaponBuilder::add_properties(),我必须传递properties参数,该参数必须为flatbuffers::Offset<void>类型。但是我不了解的是如何首先创建此对象。据我所知,在生成的.h文件中没有函数/方法可以返回这种类型的对象。我当然可以创建类型为PSword / PAxe / PMace的对象,但是如何将其转换为Flatbuffers偏移量?

1 个答案:

答案 0 :(得分:1)

您想要FlatBufferBuilder::CreateStruct。与通常序列化结构(内联)的方式相比,这确实有点怪异,这是由于工会希望所有工会成员的大小相同,因此要在偏移量上引用它们。