热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoogleProtoBuf的使用

Google的protobuf太好用了,又小,读写又快跑步快慢受鞋的影响太大了,但是造鞋的工具研究起来还是很有难度的,百度

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#中的Listrepeated int32 ints = 4;//键值对字段,理解为词典类型map 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 ClassNameClassName 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 pausefor /f "delims=" %%i in ('dir *.proto/s/b') do (echo %%iprotoc.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;


推荐阅读
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 自然语言处理(NLP)——LDA模型:对电商购物评论进行情感分析
    目录一、2020数学建模美赛C题简介需求评价内容提供数据二、解题思路三、LDA简介四、代码实现1.数据预处理1.1剔除无用信息1.1.1剔除掉不需要的列1.1.2找出无效评论并剔除 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • Halcon之图像梯度、图像边缘、USM锐化
    图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像梯度、图像边缘、USM锐化图像卷积:1.模糊2.梯度3.边缘4.锐化1.视频教程:B站、 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • gRPC框架学习:2、ProtocolBuffers学习文章目录gRPC框架学习:2、ProtocolBuffers学习1.前言2.定义消息类型(1). ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 当PHP中的tempnam()函数被禁用后的应对策略与解决方案
    当 PHP 中的 `tempnam()` 函数被禁用时,开发者需要采取相应的替代方案以确保应用程序的正常运行。本文探讨了多种应对策略,包括使用 `sys_get_temp_dir()` 结合自定义文件命名方法,以及利用第三方库来生成临时文件。此外,还详细介绍了如何在不同操作系统和服务器环境中配置临时文件路径,以提高代码的兼容性和安全性。 ... [详细]
  • Linux基础知识:Vi与Vim编辑器详解
    Linux基础知识:Vi与Vim编辑器详解 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
author-avatar
慕容盼烟迎曼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有