Windows protoBuf 安装+学习


一、protoBuf是什么?

  1. protobuf是类似与json一样的数据描述语言(数据格式)
  2. protobuf非常适合于RPC数据交换格式
    protoBuf是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

二、protoBuf优缺点

优点

  1. 序列化后体积相比Json和XML很小,适合网络传输
  2. 支持跨平台多语言
  3. 消息格式升级和兼容性还不错
  4. 序列化反序列化速度很快,快于Json的处理速度

缺点

  1. 应用不够广(相比xml和json)
  2. 二进制格式导致可读性差(因为是二进制格式,所以安全性较好)
  3. 缺乏自描述
xmljsonprotoBuf
体积很小
传输效率相对json慢很快
简单性结构复杂结构简单相对简单
通用性没有json普遍普遍不普遍
可读性凑合差,二进制文件

三、protoBuf组件安装

1. protoc下载

下载链接:https://github.com/protocolbuffers/protobuf/releases
在这里插入图片描述
在任意地方新建一个protobuf文件夹,将下载好的压缩包解压到protobuf文件夹中,本文在E盘下新建protobuf文件夹。解压后,进入其bin目录,会看见protoc.exe文件
在这里插入图片描述


配置环境变量
方法一:直接将protoc.exe复制到GOPATH/bin
方法二:配置环境变量:
环境变量-系统变量-Path-编辑-新建-proto.exe所在的路径,本文即:E:\protobuf\bin
为了统一方便管理,建议使用方法一。

验证:打开cmd,输入protoc --version


2. protoc-gen-go下载

下载:go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
最后在GOPATH/bin中看到protoc-gen-go.exe文件说明安装成功。


四、protoc命令

protoc xxx.proto --go_out=.
或者
protoc --go_out=. xxx.proto
或者
protoc --go_out=. *.proto

五、protoBuf语法

1. 例子

参考文档(需翻墙):https://developers.google.com/protocol-buffers/docs/proto3

syntax = "proto3"; 						//指定版本信息,不指定会报错
package pb;						//后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
	//    名字
    string name = 1;
	//    年龄
    int32  age = 2 ;
}

enum test{
	int32 age = 0;
}
  • protobuf消息的定义(或者称为描述)通常都写在一个以 .proto 结尾的文件中。
  • 该文件的第一行指定正在使用proto3语法:如果不这样做,协议缓冲区编译器将假定正在使用proto2。这也必须是文件的第一个非空的非注释行。
  • 第二行package指明当前是pb包(生成go文件之后和Go的包名保持一致)
  • 最后message关键字定义一个Person消息体,类似于go语言中的结构体,是包含一系列类型数据的集合。许多标准的简单数据类型都可以作为字段类型,包括boolint32floatdouble,和string。也可以使用其他message类型作为字段类型。
  • 在message中有一个字符串类型的value成员,该成员编码时用1代替名字。我们知道,在json中是通过成员的名字来绑定对应的数据,但是Protobuf编码却是通过成员的唯一编号来绑定对应的数据,因此Protobuf编码后数据的体积会比较小,能够快速传输,缺点是不利于阅读。

2. message的格式说明

消息由至少一个字段组合而成,类似于Go语言中的结构体,每个字段都有一定的格式:

//注释格式 注释尽量也写在内容上方
(字段修饰符)数据类型 字段名称 = 唯一的编号标签值;

3. message常见的数据类型与go中类型对比

.proto类型Go类型介绍
doublefloat6464位浮点数
floatfloat3232位浮点数
int32int32使用可变长度编码。编码负数效率低下——如果你的字段可能有负值,请改用sint32。
int64int64使用可变长度编码。编码负数效率低下——如果你的字段可能有负值,请改用sint64。
uint32uint32使用可变长度编码。
uint64uint64使用可变长度编码。
sint32int32使用可变长度编码。符号整型值。这些比常规int32s编码负数更有效。
sint64int64使用可变长度编码。符号整型值。这些比常规int64s编码负数更有效。
fixed32uint32总是四字节。如果值通常大于228,则比uint 32更有效
fixed64uint64总是八字节。如果值通常大于256,则比uint64更有效
sfixed32int32总是四字节。
sfixed64int64总是八字节。
boolbool布尔类型
stringstring字符串必须始终包含UTF - 8编码或7位ASCII文本
bytes[]byte可以包含任意字节序列

4. protobuf高级用法

protobuf除了上面的简单类型还有一些复杂的用法,如下:

message嵌套

messsage除了能放简单数据类型外,还能存放另外的message类型,如下:

syntax = "proto3"; 				//指定版本信息,不指定会报错,默认proto2
package pb;						//后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
	//    名字
    string name = 1;   //编号可以不从1开始,但是不能重复。也不能使用19000 ~ 19999
	//    年龄
    int32  age = 2 ;
    //定义一个message
    message PhoneNumber {
    string number = 1;
    int64 type = 2;
	}
	PhoneNumber phone = 3;
}

repeated关键字

repeadted关键字类似与go中的切片,编译之后对应的也是go的切片,用法如下:

syntax = "proto3"; 						//指定版本信息,不指定会报错
package pb;						//后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
	//    名字
    string name = 1;
	//    年龄
    int32  age = 2 ;
    //定义一个message
    message PhoneNumber {
    string number = 1;
    int64 type = 2;
	}
	
	repeated PhoneNumber phone = 3;
}

默认值

解析数据时,如果编码的消息不包含特定的单数元素,则解析对象对象中的相应字段将设置为该字段的默认值。不同类型的默认值不同,具体如下:

  • 对于字符串,默认值为空字符串。
  • 对于字节,默认值为空字节。
  • 对于bools,默认值为false。
  • 对于数字类型,默认值为零。
  • 对于枚举,默认值是第一个定义的枚举值,该必须为0。
  • repeated字段默认值是空列表
  • message字段的默认值为空对象

enum关键字

在定义消息类型时,可能会希望其中一个字段有一个预定义的值列表。比如说,电话号码字段有个类型,这个类型可以是,home,work,mobile。我们可以通过enum在消息定义中添加每个可能值的常量来非常简单的执行此操作。实例如下:

syntax = "proto3"; 						//指定版本信息,不指定会报错
package pb;						//后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
	//    名字
    string name = 1;
	//    年龄
    int32  age = 2 ;
    //定义一个message
    message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
	}
	
	repeated PhoneNumber phone = 3;
}

//enum为关键字,作用为定义一种枚举类型
enum PhoneType {
	MOBILE = 0;  //枚举值必须从0开始
    HOME = 1;
    WORK = 2;
}

如上,enum的第一个常量映射为0,每个枚举定义必须包含一个映射到零的常量作为其第一个元素。这是因为:

  • 必须有一个零值,以便我们可以使用0作为数字默认值。
  • 零值必须是第一个元素,以便与proto2语义兼容,其中第一个枚举值始终是默认值。

enum还可以为不同的枚举常量指定相同的值来定义别名。如果想要使用这个功能必须讲allow_alias选项设置为true,负责编译器将报错。示例如下:

syntax = "proto3"; 						//指定版本信息,不指定会报错
package pb;						//后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
    //    名字
    string name = 1;
    //    年龄
    int32  age = 2 ;
    //定义一个message
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
    }

    repeated PhoneNumber phone = 3;
}

//enum为关键字,作用为定义一种枚举类型
enum PhoneType {
	//如果不设置将报错
    option allow_alias = true;
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
    Personal = 2;
}

oneof关键字

如果有一个包含许多字段的消息,并且最多只能同时设置其中的一个字段(联合体),则可以使用oneof功能,示例如下:

message Person{
    //    名字
    string name = 1;
    //    年龄
    int32  age = 2 ;
    //定义一个message
    message PhoneNumber {
        string number = 1;
        PhoneType type = 2;
    }

    repeated PhoneNumber phone = 3;
    oneof data{
        string school = 5;  //编号不能重复,根据习惯顺次往下编
        int32 score = 6;
    }
}
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows安装protobuf,首先需要下载两个包:protoc和protobuf-python。具体步骤如下: 1. 首先确认你的系统版本,确保与protobuf的兼容性。 2. 下载protoc包,这是protobuf的编译器。你可以从官方网站或github上下载win32版本的protoc。 3. 下载protobuf-python包,这是protobuf的Python安装包。你可以从官方网站或github上下载相应版本的protobuf-python。 4. 解压下载的protoc和protobuf-python包。 5. 将protoc可执行文件(protoc.exe)的路径添加到系统的环境变量中,这样才能在命令行中直接使用protoc命令。你可以在系统的环境变量设置中进行添加。 6. 打开命令行窗口,输入以下命令来验证protoc是否已经成功安装: ``` protoc --version ``` 如果成功安装,你将看到protoc的版本号。 7. 运行以下命令来安装protobuf-python: ``` python -m pip install protobuf ``` 这将使用pip来安装protobuf-python包。 8. 安装完成后,你可以在Python中引入protobuf模块并开始使用protobuf了。 总结一下,在Windows安装protobuf的步骤是: 1. 确认系统版本与protobuf兼容性。 2. 下载并解压protoc和protobuf-python包。 3. 将protoc可执行文件路径添加到系统环境变量。 4. 验证protoc安装是否成功。 5. 使用pip安装protobuf-python包。 6. 引入protobuf模块,开始使用protobuf。 请注意,具体的下载链接和版本号可能会有所变化,请以官方文档为准。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Windows环境下安装python protobuf模块](https://blog.csdn.net/weixin_42310458/article/details/102550586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值