【问题标题】:Multiple Instance of an object in a FlatBuffers UNIONFlatBuffers UNION 中对象的多个实例
【发布时间】:2020-04-09 17:49:53
【问题描述】:

我是 FlatBuffers 的新手,不幸的是,Google Tutorial 对此不太清楚,所以这是我的问题:

  • 是否可以在不使用表的情况下在 FlatBuffer 联合中拥有多个对象实例?
  • 如果是,如何找回它们?

我根据教程尝试了以下代码:

import os
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '../python'))

import flatbuffers
import MyGame.Sample.Color
import MyGame.Sample.Equipment
import MyGame.Sample.Monster
import MyGame.Sample.Vec3
import MyGame.Sample.Weapon

# Example of how to use FlatBuffers to create and read binary buffers.

def main():
  builder = flatbuffers.Builder(0)

  # Create some weapons for our Monster ('Sword' and 'Axe').
  weapon_one = builder.CreateString('Sword')
  weapon_two = builder.CreateString('Axe')

  MyGame.Sample.Weapon.WeaponStart(builder)
  MyGame.Sample.Weapon.WeaponAddName(builder, weapon_one)
  MyGame.Sample.Weapon.WeaponAddDamage(builder, 3)
  sword = MyGame.Sample.Weapon.WeaponEnd(builder)

  MyGame.Sample.Weapon.WeaponStart(builder)
  MyGame.Sample.Weapon.WeaponAddName(builder, weapon_two)
  MyGame.Sample.Weapon.WeaponAddDamage(builder, 5)
  axe = MyGame.Sample.Weapon.WeaponEnd(builder)

  # Serialize the FlatBuffer data.
  name = builder.CreateString('Orc')

  MyGame.Sample.Monster.MonsterStartInventoryVector(builder, 10)
  # Note: Since we prepend the bytes, this loop iterates in reverse order.
  for i in reversed(range(0, 10)):
    builder.PrependByte(i)
  inv = builder.EndVector(10)

  MyGame.Sample.Monster.MonsterStartWeaponsVector(builder, 2)
  # Note: Since we prepend the data, prepend the weapons in reverse order.
  builder.PrependUOffsetTRelative(axe)
  builder.PrependUOffsetTRelative(sword)
  weapons = builder.EndVector(2)

  pos = MyGame.Sample.Vec3.CreateVec3(builder, 1.0, 2.0, 3.0)

  MyGame.Sample.Monster.MonsterStart(builder)
  MyGame.Sample.Monster.MonsterAddPos(builder, pos)
  MyGame.Sample.Monster.MonsterAddHp(builder, 300)
  MyGame.Sample.Monster.MonsterAddName(builder, name)
  MyGame.Sample.Monster.MonsterAddInventory(builder, inv)
  MyGame.Sample.Monster.MonsterAddColor(builder,
                                        MyGame.Sample.Color.Color().Red)
  MyGame.Sample.Monster.MonsterAddWeapons(builder, weapons)
  # Equiping the first Weapon
  MyGame.Sample.Monster.MonsterAddEquippedType(
      builder, MyGame.Sample.Equipment.Equipment().Weapon)
  MyGame.Sample.Monster.MonsterAddEquipped(builder, axe)
  # Equiping the second Weapon
  MyGame.Sample.Monster.MonsterAddEquippedType(
      builder, MyGame.Sample.Equipment.Equipment().Weapon)
  MyGame.Sample.Monster.MonsterAddEquipped(builder, sword)
  orc = MyGame.Sample.Monster.MonsterEnd(builder)

  builder.Finish(orc)

以下代码不会产生错误,但是在读取数据时似乎只能得到最后添加的武器(变量被覆盖)。那么这是预期的行为吗?

谢谢:)

【问题讨论】:

    标签: python flatbuffers


    【解决方案1】:

    不,union 代表一系列选项中的一个值(很像在 Python 中,一个变量不能容纳 2 个子类实例,除非您将其设为列表)。

    要实现您想要的,您需要一个联合向量(遗憾的是尚未在 Python FlatBuffers 中实现),或者一个表向量,每个表都包含一个联合。

    【讨论】:

    • 感谢您的回答。好的,我想唯一真正的解决方案是声明一个向量联合,每个向量都是一个特定的类型。简而言之,坚持这个例子,如果我想要一个包含不同装备武器和盔甲的联合,我将创建一个武器和盔甲表,然后创建作为武器和盔甲向量的对象,让我们说武器和盔甲,最后我会创建我的工会吗?
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多