您的位置:首页 > Web前端

FlatBuffers 使用之(一):scheme 编写

2016-01-21 13:56 453 查看

说明

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中的元素不需要被有序的存储,他们一般会被按大小的方式最优化的存储。这个属性会避免这件事发生。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: