Protobuf使用手册

转载 2017年01月03日 16:11:05

Protobuf使用手册

选择版本

syntax 声明可以选择protobuf的编译器版本(v2和v3)
syntax="proto2";选择2版本,各个字段必须明确标注编号以确定序列化后二进制数据字段的位置
syntax="proto3";选择3版本,没有强制使用字段编号

字段修饰符

required
对于required的字段而言,编号初值是必须要提供的,否则字段的便是未初始化的
对于修饰符为required的字段,序列化的时候必须给予初始化,否则程序运行会异常
optional
对于optional的字段而言,如果未进行初始化,那么一个默认值将赋予该字段编号
也可以指定默认值,如示例所示.
repeated
对于repeated的字段而言,该字段可以重复多个,即每个编码单元可能有多个该字段
在高级语言里面,我们可以通过数组来实现,而在proto定义文件中可以使用repeated来修饰,从而达到相同目的。
当然,出现0次也是包含在内的。

字段类型

proto Type C++ Type Notes
int32 int32 有符号32位整型数,非固定长度编码,编码效率比sint32低
int64 int64 有符号64位整型数,非固定长度编码
uint32 uint32 无符号32位整型数,非固定长度编码
uint64 uint64 无符号64位整型数,非固定长度编码
sint32 int32 有符号32位整型数,非固定长度编码,效率较高
sint64 int64 有符号64位整型数,非固定长度编码,效率较高
fixed32 uint32 无符号,固定4字节编码,数据大于2^28时,效率比uint32高
fixed64 uint64 无符号,固定8字节编码,数据大于2^56时,效率比uint32高
sfixed32 int32 有符号,固定4字节编码
sfixed64 int64 有符号,固定8字节编码
bool bool 布尔值
float float 浮点数
double double 浮点数
string string 必须为UTF-8编码或者7bit ASCII字符串
bytes string 字节数组

字段类型对应二进制类型

字段类型 二进制类型 二进制编码值
int32,int64,uint32,uint64,sint32,sint64,bool,enum Varint(可变长度int) 0
fixed64,sfixed64,double 64bit固定长度 1
string,bytes,inner messages(内部嵌套),packaed repeated fields(repeated字段) Length-delimited 2
groups(deprecated) Start group 3
groups(deprecated) Endd group 4
fixed32,sfixed32,float 32bit固定长度 5

完整示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
message IntType {
	optional int32 a_i32 = 1;
	optional int64 b_i64 = 2;
	optional sint32 c_s32 = 3;
	optional sint64 d_s64 = 4;
	optional sfixed32 e_sf32 = 5;
	optional sfixed64 f_sf64 = 6;
}

message UIntType {
	optional uint32 a_u32 = 1;
	optional uint64 b_u64 = 2;
	optional fixed32 c_f32 = 3;
	optional fixed64 d_f64 = 4;
}

message FType{
	optional float a_f = 1;
	optional double b_d = 2;
	optional bool c_b = 3;
}

message BSType{
	optional string a_s = 1;
	repeated bytes b_bs = 2;
}

嵌套与引用

1.嵌套定义


message定义中可以嵌套定义message,enum
嵌套定义的单元外部可见,引用路径由外到内逐层引用
2.引用


定义package相当于C++的namespace,外部引用时需要package名
引用外部message定义,只需要import外部proto文件即可使用
引用使用相对路径,生成文件时protobuf可以自动处理
完整示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//user.proto

syntax="proto2“;
package user;

message User{
    required sfixed64 uid = 1;
    
    enum PhoneType{
        NONE = 1;
        HOME = 2;
        MOBILE = 3;
    }
    
    message PhoneNumber {
        required string number = 1;
        optional PhoneType type = 2 [default = MOBILE];
    }
    
    repeated PhoneNumber phone = 2;
    
    optional sfixed32 age = 3;
}

message Admin {
    required sfixed64 uid = 1;
    optional User.PhoneNumber phone = 2;
}
由协议生成C++文件:protoc --cpp_out=${DIR} proto-file...
多个协议文件依赖关系:protoc --cpp_out=${DIR} base-proto-file deliver-proto-file...
依赖问题按相对路径处理import即可解决


http://linghutf.github.io/2016/06/08/protobuf/

ProtoBuf安装和使用简介

在前一篇文章中,对ProtoBuf做了一个基本介绍,这篇文章主要介绍ProtoBuf的安装和使用。 ProtoBuf的安装 安装ProtoBuf前需要先安装ProtoBuf的编译器和运行时环境。 对于...
  • hailong0715
  • hailong0715
  • 2016年07月28日 18:58
  • 16461

google protobuf学习笔记二:使用和原理

一.什么是protobuf protobuf全称Google Protocol Buffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具库。它和XML或者JSON差不多,...
  • majianfei1023
  • majianfei1023
  • 2015年04月19日 19:57
  • 21774

protobuf使用方法

person.proto文件 [cpp] view plaincopy message Person{       required string nam...
  • qeshining
  • qeshining
  • 2015年08月11日 18:38
  • 385

Protobuf简单使用

Protobuf是Google开发一种数据描述语言,能够将结构化数据序列化,可用于数据存储、通信协议等方面。据Google官方文档介绍,现在Google内部已经有48,162个消息类型定义在12,18...
  • ashimidashajia
  • ashimidashajia
  • 2015年10月09日 11:22
  • 502

protobuf使用简介

1 protobuf介绍 2
  • Erli11
  • Erli11
  • 2014年05月30日 12:17
  • 6000

使用Protobuf的一些经验总结

近段时间由于工作中要用到Google的protobuf序列化工具,需求是在socket中使用protobuf序列化后进行数据的交互。从不了解到会入门使用这个过程可谓是坎坷,遇到了几个关键的问题: a、...
  • zmq_2013
  • zmq_2013
  • 2015年10月23日 11:36
  • 837

Protobuf的简单介绍、使用和分析

Protobuf的简单介绍、使用和分析 一、protobuf是什么?         protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议...
  • shuliwuflying
  • shuliwuflying
  • 2016年03月06日 16:56
  • 4821

Google 的开源技术protobuf 简介与例子

本文来自CSDN博客:http://blog.csdn.net/program_think/archive/2009/05/31/4229773.aspx   今天来介绍一下“Protocol Buf...
  • caisini_vc
  • caisini_vc
  • 2010年05月17日 10:11
  • 330027

GOOGLE PROTOBUF学习与使用心得

先占个坑,这两天入门了protobuf,真心好用,想把学习的过程中记录下来,供记录与学习之用。...
  • lisarer
  • lisarer
  • 2016年06月22日 11:31
  • 512

Protobuf简单使用及其抓包分析

早之前就用过Google的Protobuf做数据编码,一直没有深入理解其中的原理,最近做了一次通讯抓包,发现其中很多Protobuf编码的数据包,于是决定分析一下其中的数据包及其编码。一、Protob...
  • wangqiuyun
  • wangqiuyun
  • 2014年12月24日 11:36
  • 24990
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Protobuf使用手册
举报原因:
原因补充:

(最多只允许输入30个字)