protobuf-compiler

Protobuf

Google Protocol Buffers 简称 Protobuf, 是Google公司内部的混合语言数据标准,提供了一种轻量高效的结构化数据存储。

为什么要使用protobuf呢?

  • 灵活高效结构化数据存储格式(.proto),便于序列化适合RPC的数据交换。
  • 与XML相比更小更快更简单,仅需要编写*.proto文件描述所需的数据结构,protobuf会实现相关类的方法。
  • 提供C++、Java、Python、Go、C#等多种语言的API

安装配置

$ sudo apt-get install protobuf-compiler

定义.proto文件

定义 proto 文件仅需给每个结构体数据定义一个 message, 然后给结构体中的每个数据添加类型和名称。

# 定义一个搜索请求的消息格式,每个请求包含查询字符串、页码、显示条数。
$ vim search.proto
message SearchRequest{
  required string query = 1; //查询字符串
  optional int32 page = 2; //当前页码
  optional int32 pagesize = 10; //每页显示条数
}
$ vim person.proto
package tutorial;

message Person{
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;
  enum PhoneType{
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message Phone{
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  required Phone phone = 4;
}

message Address{
  repeated Person person = 1;
}

消息格式

消息格式有3个字符,在消息承载的数据分别对应每个字段,每个字段用有一个名字和类型。

  • 指定字段类型
    字段分为标量类型和合成类型,合成类型包括枚举(enumerations)或其他消息类型。

  • 分配标识号
    在消息定义中每个字段都有唯一的标识符,用来在消息的二进制格式汇总识别各个字段,一旦开始使用就不能再更改。
    最小的标识号可以从1开始,最大到2的29次方减去1即536,870,911。不可使用[19000 -19999]的标识符,protobuf协议实现中对其进行了预留。

  • 指定字段规则(字段修饰符)

    • required
      表示值是必须设置的,格式良好的消息至少含有1个required类型,不得超过1个。
      required是永久的,在将字段标识为required时,应特别小心。
      某些情况下若不想写入或发送一个required的字段,将原始该字段修饰符更改为optional可能会遇到问题,旧版本用户会认为不含该字段的消息时不完整的,从而可能会无目的的拒绝解析。在此种情况下,应考虑编写特别 针对应用的、自定义的消息校验函数。Google工程师表明,使用required弊大于利,他们更加原意使用optionalrepeated而不是 required ,当然,它并不具有普遍性。
    • optional
      消息格式中optional选项可有0个或1个,不得超过1个。
    • repeated
      在一个格式良好的消息中,repeated字段可重复任意多次,包括0次。
      重复值的顺序会被保留,表示该值可重复,相当Java中的List。
      由于历史原因,基本类型的repeated字段并没有被尽可能地高效编码,新代码中用户应该使用特殊选项[packed=true]来保证更高效的编程。
repeated int 32 samples = 4 [packed = true];
  • 在一个*.proto文件中可定义多个消息类型,定义多个相关的消息时,特别有用。
# 定义与SearchResponse消息类型对应的回复消息格式。
message SearchResponse{
  required string query = 1;
  optional int32 page = 2;
  optional int32 pagesize  = 10;
}
  • 注释:*.proto文件注释采用C/C++/Java的//风格。

使用注意

  • .proto文件生成了什么?当用 protobuffer编译器来运行.proto文件时,编译器将生成所选语言的代码,代码可以操作在.proto文件中定义的消息类型、包括获取、设置字段值,将消息序列化到一个输出流中,并从 一个输入流中解析消息。
  • C++,编译器为每个*.proto文件生成.h.cc文件,.proto文件中每个消息有一个对应的类。
  • Java,编译器会为每个消息类型生成一个.java文件以及一个特殊的Builder类,该类时用来创建消息接口的。
  • Python 编译器为 .proto文件每个消息生成一个含有静态描述符的模块,该模块与一个元素(metaclass)在运行时(runtime)被用来创建所需的Python数据访问类。
# cocos-quick中运行项目出现错误信息

can not get file data of D:/cocos/projects/hj/src/protobuf/c.lua
[LUA-print] ----------------------------------------
[LUA-print] LUA ERROR: [string ".\app/core/protobuf/protobuf.lua"]:1: module 'pr
otobuf.c' not found:

原因:quick-cocos2dx 尚未集成google的protobuf,需在quick中添加解析protobuf的扩展。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容