Google ProtoBuf的使用

Google ProtoBuf的使用_第1张图片

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

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

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

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

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

Google ProtoBuf的使用_第2张图片

 不过下载的文件却不是什么是用的编辑语言相关的,什么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,直接编辑文本就可以了(为了结构清晰,我是在程序集目录下创建另一个proto的文件夹,导出的脚本也创建了一个文件output)

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

//message为声明一个对象,名称为ClassName
message ClassName1 {
    //[对象的类型] 类型 变量名称 = 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  key_value = 5;
/* 关于编号,是字段中唯一且必须的,以1开始,不能重复,不能跳值,这个是和编译有关系的 */
}

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

double,

int32,

int64,

string,

bool,

枚举类型:Enum.proto

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

关于引用其他proto中的类型,在创建一个ClassName2.proto

syntax = "proto3";

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

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

基础的方法需要cmd命令

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

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

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

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

文件夹的目录结构:

--protoc.exe
--proto
    --ClassName.proto
    --Enum.proto
    --ClassName2.proto
    --test
        --test2.proto
--output

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

@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/ ./proto/ClassName.proto
rem pause

for /f "delims=" %%i in ('dir *.proto/s/b') do (
	echo %%i
    rem proto_path是所有proto的父级目录结构,csharp_out是导出的C#脚本路径,批量导出的话,三个参数都是必须的
	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;

你可能感兴趣的:(C#,protobuf)