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

目录
相关文章
|
6月前
|
Java 编译器 API
protobuf万字语法详解
当用protocol buffer编译器来运行.proto文件时,编译器将生成所选择语言的代码,这些代码可以操作在.proto文件中定义的消息类型,包括获取、设置字段值,将消息序列化到一个输出流中,以及从一个输入流中解析消息。
75 0
protobuf万字语法详解
|
编解码 Java 编译器
【Protobuf】Protobuf中的Message语法规范
在Message中定义一个或者多个字段,FieldType是字段的数据类型,可以是基本类型(如int32、string、bool等)或其他定义的Message类型。fieldName是字段的名称,可以根据需求自定义。fieldNumber是字段的唯一标识号,用于在消息的二进制编码中标识字段。
381 0
|
2月前
|
Go
Golang语言之映射(map)快速入门篇
这篇文章是关于Go语言中映射(map)的快速入门教程,涵盖了map的定义、创建方式、基本操作如增删改查、遍历、嵌套map的使用以及相关练习题。
39 5
|
3月前
|
Go
Go - 如何编写 ProtoBuf 插件 (一) ?
Go - 如何编写 ProtoBuf 插件 (一) ?
41 2
|
6月前
|
Java 编译器 Go
Protobuf3语法笔记
Protobuf3语法笔记
94 0
|
JSON Linux 测试技术
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
go语言处理数据、基本通信以及环境配置 -- json,protobuf,grpc
|
存储 人工智能 Java
深入了解Golang:基本语法与核心特性解析
深入了解Golang:基本语法与核心特性解析
|
XML JSON Java
Protobuf 语法详解
Protobuf 语法详解
199 0
|
Go
Golang 语言函数的高级使用方式
Golang 语言函数的高级使用方式
49 0
|
Go
Golang语法入门指南
Go是一种现代、高效、并发的编程语言,被设计用于构建可靠且高性能的软件。它具有简单的语法和强大的标准库,适用于各种类型的应用程序开发。本博客将引导您快速入门Golang的基本语法,并提供一些实用的技巧和最佳实践。
90 0
下一篇
无影云桌面