protobuf 语法简介

简介: protobuf 语法简介 1.基本语义 在.proto文件中,最基本的数据类型为message,如其定义所示,由message引导,之后是message类型的名字,之后是由{}包含的各个域(fields)。

protobuf 语法简介

1.基本语义

在.proto文件中,最基本的数据类型为message如其定义所示,由message引导,之后是message类型的名字,之后是由{}包含的各个域(fields)

required string name = 1; 域字义的一个例子。

required 表示这个域是必需的

optional 该域选,出现0次或1次

repeated 重复出现,0次或多次

string是域的类型,可是简单的标量类型(如bool,int32,float,double,string等),也可是复合类型(message,enum)

name是域的名字,=1是给域一个数字标签,这会影响到该域在二进制文件中顺序。

关于这个数字标签也是有说明的,115是只使用一个字节编号,而其他的使用多个字节,所以应把1-15编号给最经常使用的域。数字标签的最大值为2^29 - 1(或536,870,911),其中还有一段是保留用于proto的实现,从1900019999(FieldDescriptor::kFirstReservedNumberFieldDescriptor::kLastReservedNumber)

有optional说明的域可以有一个默认值,在不指定该域时使用,如optional PhoneType type = 2 [default = HOME];

还有一种类型是enum,如上enum PhoneType的定义。类型可以定义在一个message类型中,也可以单独定义,如上enum PhoneTypemessage PhoneNumber是嵌套定义在message Person中,message AddressBook中单独定义的。

可以访问一个嵌套定义在另一个message类型中的message,但需使用域范围标示,如同的c++里使用另一个命名空间的类:person::PhoneNumber

添加注释://

optional int32 page_number = 2;// Which page number do we want?

2.导入

导入:proto可以导入在不同的文件中的定义。通过在文件顶端加入一个import语句

import "myproject/other_protos.proto";

3.扩展

扩展:proto支持将一定范围内的数字编号作为扩展时使用。

message Foo {

// ...

extensions 100 to 199;

}

extend Foo {

optional int32 bar = 126;

}

4.

proto支持包的使用,以防止命名冲突。在文件的开始部分指定:package tutorial。不同的语言在生成代码对包的处理是不同的:c++中作为命名空间,java中也作包,python中是模块。

options:可使用option来指定一些选项,会对生成的代码有一些影响。option分文件层的和域层的。在上面的例子中就使用了文件层的:

option java_package = "com.example.tutorial";

option java_outer_classname = "AddressBookProtos";

5.生成代码:使用protoc编译器就可以生成相应语言的代码。

protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path/file.proto

protoc.exe是编译器的名字;--proto_path指定对导入文件的搜索路径,若不指定,则为当前路径;--cpp_out指定生成c++文件的路径,--java_out--python_out分别是生成javapython代码的路径;path/file.proto是定义结构的.proto文件。

使用c++语言,会生成针对每个message类型的一个类,对每一个类也提供了相应的处理方法,还提供了序列化到输出流和从输入流中解析的方法。

原文

http://blog.itpub.net/post/42700/527047

http://www.cnblogs.com/mydomain/p/3176373.html

目录
相关文章
|
2天前
|
存储 程序员 API
python web开发示例详解
python web开发示例详解
12 0
|
2月前
|
存储 搜索推荐 程序员
【python】—— 库的基本介绍
【python】—— 库的基本介绍
|
4月前
|
存储 API Docker
Python 架构模式:附录 A 到 E
Python 架构模式:附录 A 到 E
189 0
|
9月前
|
XML 存储 JSON
ProtoBuf 第一章、初识
Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化方法,但是比XML 更小、更快、更为简单。你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。3. 依赖生成的接口,实现对 .proto 文件中定义的字段进行设置和获取,和对 message 对象进行序列化和反序列化。
64 0
|
11月前
|
Python
【Python入门】字符串的扩展(一)
【Python入门】字符串的扩展(一)
|
IDE Java Linux
Python基础用法 上
Python基础用法 上
98 0
|
Python
Python封装简介
Python封装简介自制脑图, 封装是面向对象的三大特性之一,如何隐藏一个对象中的属性,如何获取(修改)对象中的属性。 简单说就是一些内部自己用的属性或方法不希望被外部所访问的,这时候就要封装起来。所以,封装就是隐藏不希望被外部所访问到的属性或方法。 使用封装,确实增加了类的定义的复杂程度,但也确保了数据的安全性。
111 1
Python封装简介
|
设计模式 算法 程序员
C++:STL库简介
一、前言 STL是c++中的一个标准模板库,作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。
247 0
|
XML 数据格式 Python
Python RPC | 连载 02 - XMLRPCServer
Python RPC | 连载 02 - XMLRPCServer
Python RPC | 连载 02 - XMLRPCServer
|
Java Maven Python
Google protobuf在python中的应用研究
Google protobuf在python中的应用研究
265 0
Google protobuf在python中的应用研究