Google ProtoBuf的使用

news2024/11/19 15:27:22

Google的protobuf太好用了,又小,读写又快

跑步快慢受鞋的影响太大了,但是造鞋的工具研究起来还是很有难度的,百度真是充斥的大量的转载文件,不管能不能用、能不能看懂,反正是各种转载,有的连错别字都一模一样,为此还走了很多弯路,什么ProtoTool、ProtoGen,使用起来就各种失败、各种错误,有时候用的是开始很顺利,然后突然就卡住了,完全百度不出来问题;但是研究官方文档吧,真的的是又基础又专业,各种名词解释起来完全不知所云,又没UI可视化的编辑器制之类的,完全不是给普通人看嘛T_T。

不过功夫不负有心人,只要肯花时间,这块骨头还是好啃的,回头看来,真的是被百度坑惨了。

关于protobuf本身是比较简单,只需要一个exe就基本能满足使用需求了

这是传送门https://github.com/protocolbuffers/protobuf/releases/

 不过下载的文件却不是什么是用的编辑语言相关的,什么java,什么csharp什么的,直接无视掉,点击Show all

这个才是重点,然后选择和系统相关的文件 

下载win64,这个就不多解释了 

解压之后进入到.protoc/bin里面找到这个protoc.exe,这才是主角,其他的完全忽略掉,

关于高级的API、扩展之类的就先不用研究了,这完全不是刚开始学车时应有的样子,漂移什么,先学好方向盘再说吧!

然后开始准备工作

1.先设置一下环境变量

在系统变量的Path中添加protoc.exe的所在文件夹路径,这个不会的自行Internet吧,

cmd中可以查看是否调试好,打印出protoc的版本号

[protoc.exe路径] --version

正确输出libprotoc...就可以

2.准备.proto文件

这里关于proto里的内容有个简单的介绍,科学上网官方文档https://developers.google.com/protocol-buffers/docs/proto3

与时俱进,就直接proto3 版本了

创建文本后缀名称为ClassName.proto,直接编辑文本就可以了

//双斜杠注释
//proto的版本为proto3,每个proto文件都要加这行
syntax = "proto3";

//message为声明一个对象,名称为ClassName
message ClassName {
    //[对象的类型] 类型 变量名称 = 1编号
    //singular是单个意思,就是有一个当前的变量,对象的类型缺省时singular是默认值
    singular int32 ID = 1;
    int32 ID2 = 2;
    //optional的含义和singular是一样的,区别在于当ID3未赋值的时候,该字段是不会序列化的
    optional int32 ID3 = 3;
    //repeated标识该字段有0个或者多个,对应C#中的List
    repeated int32 ints = 4;
    //键值对字段,理解为词典类型
    map <int32,string> key_value = 5;
/* 关于编号,是字段中唯一且必须的,以1开始,不能重复,不能跳值,这个是和编译有关系的 */
}

关于变量类型,一般需求使用一下几种就可以了,其他类型在官方文档内可以找到,对应不同的语言

double,

int32,

int64,

string,

bool,

枚举类型:Enum.proto

//枚举,需要注意的点是proto3中第一个枚举值必须为0,然后导成对应的编程语言就一目了然了
enum Enum{
    enum1 = 0;
    enum2 = 1;
    enum3 = 1;
    enum4 = 4;
}

关于引用其他proto中的类型

syntax = "proto3";

/*引用同目录下proto文件,如果在子文件夹内,要添加完成的路径
*比如同目录下有文件夹test,内有test2.proto文件
*import "test/test2.proto"
*/
//引用ClassName.proto
import "ClassName.proto"
//引用Enum.proto
import "Enum.proto"
message ClassNam2{
    //中message ClassName
    ClassName classname = 1;
    Enum enum1 = 2;
}

准备工作完成,好戏开始了:

基础的方法需要cmd命令

然后cd到protoc.exe所在的文件夹路径,输入命令:(protoc --h可以查看帮助,但感觉帮助不大)

------通过命令输出C#类的脚本,
protoc --csharp_out=[输出C#脚本的路径] [proto文件路径]

这很基础的通过解析proto导出C#类型的脚本类,其中代码结构和proto中是一样的,message中每一条数据在C#中都有对应的变量,

有了这个基础的操作,真正开始流水线工作就需要bat的批量方式了

我这里有个我自己用的批量导出方式,肯定会有更优雅的代码,以后再说吧

@echo off
set "proto_dir=%cd%\proto"
set "out_path=%cd%\output"
rem 输出的文件路径
if not exist %out_path% md %out_path%

rem 输出单个proto
rem protoc.exe  --csharp_out=./output/ ./ClassName.proto
rem pause

for /f "delims=" %%i in ('dir *.proto/s/b') do (
	echo %%i
	protoc.exe  --proto_path="%proto_dir%" --csharp_out="%out_path%" "%%i"
   )
echo finish... 
pause

到此proto就告一段落了,导出可以使用的脚本放到工程里,message的类就可以使用了

C#:使用proto,可能还需要一些类库

using Google.Protobuf;
using System.Buffers;
using System.Memory;
using System.Runtime.CompilerServices.Unsafe;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年企业固定资产管理怎么破局?

2022年已经在风雨中过去&#xff0c;转眼我们迎来了2023年。过去的一年&#xff0c;固定资产管理的痛依旧历历在目&#xff0c;如何让新的一年中&#xff0c;固定资产管理工作有所突破&#xff0c;不再承受固定资产资产管理的痛处&#xff0c;是每个企业管理者和企业固定资产管…

snap打包初步了解

前言 和snap比较类似的有三种打包方式&#xff1a; Snap Flatpak appimage Appimage是将所有的资源打包在一起&#xff0c;以一个类似与独立exe的方式执行&#xff0c;虽然简单使用&#xff0c;但是解压资源和本地缓存数据都比较麻烦。 Flatpak和snap十分类似&#xff0c;但…

XXE无回显攻击详解

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XXE无回显攻击详解。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

怎么把element的tootip设置为点击后出现提示框,且在提示框里面放其他元素,vue2动态给对象添加属性并实现响应式应答,样式穿透

怎么把element的tootip设置为点击后出现提示框 我目前有一个需求&#xff0c;就是要点击文字才会出现提示框&#xff0c;而不是hover上去就以后&#xff0c;找资料看文档&#xff0c;看了半天让我终于实现了&#xff0c;其实也不难&#xff0c;可能是最开始我没有理解value&am…

Akka 进阶(一)Dispatcher调度器

目录一 Dispatcher 任务分发1.1 理解什么是Dispatcher1.2 Executor的分类1.3 基本使用1.4 其他类型的调度器在Akka中&#xff0c;Actor的消息通信和任务执行建立在一个完全透明的调度机制之上&#xff0c;它屏蔽了底层线程&#xff08;池&#xff09;的实现细节&#xff0c;几乎…

Java: static,final,代码块 的详解

Java: static&#xff0c;final&#xff0c;代码块 的详解 每博一文案 山本文绪说过这样一句话&#xff1a;哪些决定放弃了的事&#xff0c;就请放弃得干干净净。哪些决定再也不见面的人&#xff0c;就真 的不要再见面了&#xff0c;不要再做背叛自己的事&#xff0c;如果想要…

CentOS7迷你版安装Redis并配置基础信息

1. 安装gcc、wget依赖 yum install gcc yum install wget 2. 使用命令&#xff1a;wget http://download.redis.io/releases/redis-6.2.5.tar.gz 下载安装包&#xff0c;注意要先cd到要下载到的目标位置&#xff09; 3. tar -zxvf redis-6.2.5.tar.gz 解压压缩包 4. cd redis-…

学习周报-20221223

文章目录一 Linux的ACL访问控制列表一 基础概念1.1 起因1.2 系统支持1.3 相关定义二 查看ACL权限2.1 简单查看2.2 详细查看2.3 具体配置三 更改ACL权限3.1 添加或修改ACL3.2 输出和输入3.3 设置ACL掩码3.4 递归修改ACL3.5 删除ACL3.6 控制默认ACL权限二 Linux磁盘分区中物理卷&…

zabbix6.0安装教程(七):从web界面安装

zabbix6.0安装教程&#xff08;七&#xff09;&#xff1a;从web界面安装 目录一、欢迎主界面二、先决条件检查三、配置数据库连通性四、配置本章节提供有关Zabbx Web界面的部署步骤说明。Zabbix 前端是由PHP语言编写&#xff0c;所以其网页服务的运行需要支持PHP语言的网站服务…

Allegro如何任意角度走线操作指导

Allegro如何任意角度走线操作指导 Allegro支持在PCB上进行任意角度走线,尤其是在高速设计的时候,尤为常见,如下图 具体操作如下 选择add connect命令Find选择Cline segs

谷歌要给移动VR定规矩

代号牛轧糖的最新安卓7.0手机操作系统发布两天后&#xff0c;谷歌公司开发的虚拟现实&#xff08;VR&#xff09;平台Daydream&#xff08;下称“白日梦”&#xff09;也将在未来几周推出。与平台一同推出的&#xff0c;还有来自Hulu和YouTube等视频网站“网红”们的全新视频内…

【软件工程】实验3:软件详细设计

CAM系统的类图 CAM系统的顺序图 CAM系统模拟实现&#xff08;CAM工具库封装&#xff09; 1、代码运行界面 &#xff08;1&#xff09;根据提示输入要加工的图形类型 &#xff08;2&#xff09;J-Soft软件会根据输入的数字提示用户输入不同的图形参数&#xff0c;图形参数输入…

函数栈帧(栈区)

函数栈帧&#xff08;栈区&#xff09;一.前言二.main函数空间的开辟&#xff08;函数调用是如何做到的&#xff09;三.main函数内部的变量初始化&#xff08;局部变量是如何创建的以及为什么是随机值&#xff09;四.main函数内部的函数创建1.函数是如何传参的2.传参的顺序以及…

物联网通信技术原理第2章 无线通信技术(期末重点)

目录 2.1 无线通信基本知识 2.1.2 无线通信的特点 2.2 无线信道 2.2.1 恒参无线信道举例 2.2.2 恒参无线信道特性及其对信号传输的影响 1. 幅度—频率畸变 2. 相位—频率畸变​编辑 2.2.3 随参无线信道距离 1、短波电离层反射 2、对流层散射信道 2.2.4 随参信道特性及…

漏洞深度分析|Apache Karaf 4.2.16 存在JNDI 注入漏洞

项目地址 GitHub - apache/karaf: Mirror of Apache Karaf 项目介绍 Apache Karaf是一个模块化运行时&#xff0c;支持多种框架和编程模型&#xff08;REST/API、web、spring boot 等&#xff09;。它提供了统包功能&#xff0c;您可以毫不费力地直接利用这些功能&#xff0…

戴维南定理

定理内容&#xff1a;任意二端口直流网络都可以被一个等效电路替换&#xff0c;这个等效电路只包含一个电压源和一个串联电阻&#xff0c;如图1所示。 图1 戴维南定理的作用 1、分析含有非串联或非并联电源的网络 2、用最少数量的元件实现复杂网络的端口特性&#xff08;端口前…

【深入浅出Spring原理及实战】「开发实战系列」SpringSecurity原理以及实战认证分析开发指南

前提介绍 承接上一篇文章&#xff0c;相信大家应该已经对SpringSecurity的原理有了一定的认识&#xff0c;而本篇文章给大家带来的则是在实际业务开发中的技术指南&#xff0c;希望对你有所帮助。所谓知彼知己方能百战百胜&#xff0c;用Spring Security来满足我们的需求最好了…

我们国家都有哪些信息安全标准

写在前面 早年刚参加信息安全工作更多的学点皮毛技术&#xff0c;到处找安全工具&#xff0c;跟踪poc&#xff0c;拿到一个就全网扫一遍&#xff0c;从来没有想过&#xff0c;系统化的安全工作应该怎样搞?我做的工作在安全体系中处于哪个阶段? 后来有机会做企业安全建设&…

503.下一个更大元素II,42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

C++:vector操作笔记

本文记录了对C中的vector容器的简单操作&#xff0c;包括给vector添加元素、按指定列排序、取值。 文章目录一、vector 和普通数组之间的转化二、根据vector数组的某一列数据排序三、删除二维 vector 数组最后一列数据一、vector 和普通数组之间的转化 1&#xff0c;数组转vec…