热门标签 | 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;


推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
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社区 版权所有