FlatBuffers 使用之(一):scheme 编写

来源:互联网 发布:网络运营商远程无反应 编辑:程序博客网 时间:2024/06/05 04:11

说明

FlatBuffers scheme语言的语法和C语言、接口类语言是有一些类似的。下面是一个官方scheme的例子:

namespace MyGame;    attribute "priority";  enum Color : byte { Red = 1, Green, Blue }   union Any { Monster, Weapon, Pickup }  struct Vec3 {    x:float;    y:float;    z:float;  }   table Monster {    pos:Vec3;    mana:short = 150;    hp:short = 100;    name:string;    friendly:bool = false (deprecated, priority: 1);    inventory:[ubyte];    color:Color = Blue;    test:Any;  }root_type Monster; 

表(table)

表(table)是FlatBuffers中最主要的定义对象的方式。他包括一个名字(例子中是Monster)和所有字段的列表。每个字段需要有一个名字,一个类型,和一个可选填的默认值(如果不写默认值,默认为0或null)。table中每个的字段都是可选的:在每一个个体对象中,你可以选择性的省略字段。总之,你可以灵活的添加字段,而不用为数据膨胀担心。注意:
你可以添加新的字段,但是只能在添加在table定义的结尾处。旧的数据还是可以正确的被读取。旧的代码将会忽略新的字段。如果你想灵活的使用任何旧的字段,你可以手动的分配ids,下面会在属性里详细说明。
你不能删除你不再使用的字段,不再把他们写入你的数据就可以起到同样的作用。你也可以把他们标记成deprecated,像上面的例子一样。这样就可以防止访问器的生成,通过这种方法强制弃用你想弃用的字段。
你可以更改字段的名字和table的名字,如果你确定你的代码不会出问题在你改了名字之后。

结构(Structs)

structs和table基本一样。区别:每一个字段都是必选的(所以也没有默认值);字段不能被添加或者弃用(deprecated);structs只能包含标量或者其他structs。
当你需要一个简单的的对象,并且你下分确定将不会对它进行更改(就像Vec3),你可以使用structs。struct比table使用更少的内存,也比table更快。

类型(types)

标量类型:

  • 8bit:byte ubyte bool
  • 16bit:short ushort
  • 32bit:int uint float
  • 64bit:long ulong double

非标量类型:

  • 其它所有类型的矢量(表示为[type])。矢量的嵌套是不可以的,除非你可以把内部矢量包在一个table里。
  • string。string只能承载UTF-8 or 7-bit ASCII。其他的编码或2进制数据使用矢量([byte]或者[ubyte])。
  • 其它talbe或struct,enum或union的引用。


(默认)值

只有标量有默认值,非标量字段默认为null当没有被赋值时。使用默认值的字段实际上没有被存到序列化的数据中,只是在代码中产生。所以当你更改默认值的时候,你将得到和老版本schema代码所生成的不同的值。例子:假如我设置Mana为150,和默认值一样,或者我没有设置Mana。我拿到的Mana值都会是150。如果我改变schema中的默认值为50。我在代码中拿到的Mana值就会变成50。


枚举(Enums)

定义一系列的被命名的常量,其中每一个都被赋予一个值,或者是前一个的增量。默认第一一个值为0。你需要使用“:”声明一个潜在的类型(例子中为byte)。这个类型用来限定每个枚举中的字段的类型。Enum中的值只可以添加,不可以删除。


Unions

基本和Enums一样。但Union不是常量的名字,而是一个table的名字。Union字段可以承载任table类型的引用(除了root),并隐性的添加一个后缀为_type的字段承载一个相关的enum值。


命名空间(Namespaces)

将会生成一个对应的命名空间。


包含(Includes)

你可以在当前schemas中包含其它schemas文件。但在生成的时候不会生成Include中的内容。


Root类型

这个声明了你想要序列化数据的root talbe(或struct)。


属性(Attributes)

属性声明在字字段后面。可用的属性:
  • Id:n(只能在talbe字段后使用):手动的设置字段的编号为n。如果你使用这个属性,你必须在当前table中的所有的字段中使用这个属性。数字从0开始,且必须连续。如果你有一个union字段,union字段需占用两个id。例如:你的union字段前的字段编号为6,则这个union字段的编号应为8.添加新的字段时,必须使用下一个可用的id。
  • deprecated:不再为这个字段创建访问器,代码中也不能再使用这个数据。
  • required(只能用在table中的非标量字段):这个字段必须被设置。
  • original_order(使用在table中):因为table中的元素不需要被有序的存储,他们一般会被按大小的方式最优化的存储。这个属性会避免这件事发生。
1 0
原创粉丝点击