Google.Protobuf的学习(理解基本的使用流程)

上次我们提到了一个比较特殊的类,Addressbook,然后他开头第二行有这末个东西

要编辑这个proto后缀的文件,需要用protoc来编辑

https://github.com/protocolbuffers/protobuf/releases

不要问我为什么不下载64位的,问就是64位的我不会搞

为.exe文件设置环境变量

这样做的好处是,在任何地方都可以运行.exe文件

此电脑-属性-高级系统设置-高级-环境变量-编辑用户变变量的Path变量-添加protoc.exe的所在目录.

比如我的目录是:D:\Protoc\protoc-3.7.0-rc-2-win32\bin

Google.Protobuf的学习(理解基本的使用流程)_第1张图片

迁移include文件夹下的文件

如果没有include文件夹下的文件,在使用protoc.exe时会提示缺少google\protobuf\timestamp.proto
解决办法是将include/google文件夹移动到指定了环境变量的文件夹

Google.Protobuf的学习(理解基本的使用流程)_第2张图片


然后就可以在cmd中输入protoc,他应该会像配置Java环境那样有一大长串

Google.Protobuf的学习(理解基本的使用流程)_第3张图片

准备工作做好了,我们来找找这个万恶之源,address.protoc

Google.Protobuf的学习(理解基本的使用流程)_第4张图片

然后把它拖到Rider查看(报错可以不用管,因为我们是强行直接读取的文件,它所依赖的包或者文件并没有被我们当前的工程所涵盖,所以会报错)

Google.Protobuf的学习(理解基本的使用流程)_第5张图片

发现比较难懂
package 对应于c#中的命名空间 
required 对应类的属性 (该变量必填)
optional 创建一个具有默认值的属性,通过[default=XXX]设置默认值,不添加默认为空置。如string默认为“”,int默认为0 
enum 创建枚举 
message 创建自定义类或内部类 
repeated 对应list列表数据 

有同学发现了,明明package才代表命名空间,但我们的AdressBook类的命名空间却是

为什么呢?正好,我们做个实验,顺便学习一下使用protoc.exe生成cs文件

我们把这一行注释

由于我的addressbook.proto在D:\protobuf-csharp-3.7.0-rc-2\protobuf-3.7.0-rc-2\examples

所以我的命令行输入如下(注意,第三句的/与a之间有空格,不然会出错)

d:
cd D:\protobuf-csharp-3.7.0-rc-2\protobuf-3.7.0-rc-2\examples
protoc --csharp_out=./ addressbook.proto

然后我们就发现生成了AddressBook.cs文件

至于它的命名空间,是我们的package名,tutorial(他底层把T大写了)

所以我们得出结论,是下面那行

option csharp_namespace = "Google.Protobuf.Examples.AddressBook"

把package所重写了

 

最后,分享给大家protobuf的常用语法

.proto类型

Java 类型

C++类型

备注

double

double

double

 

float

float

float

 

int32

int

int32

使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。

int64

long

int64

使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。

uint32

int[1]

uint32

Uses variable-length encoding.

uint64

long[1] uint64 Uses variable-length encoding.

sint32

int

int32

使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。

sint64

long

int64

使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。

fixed32

int[1]

uint32

总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。

fixed64

long[1]

uint64

总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。

sfixed32

int

int32

总是4个字节。

sfixed64

long

int64

总是8个字节。

bool

boolean

bool

 

string

String

string

一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。

bytes

ByteString

string

可能包含任意顺序的字节数据。

以及

https://blog.csdn.net/u011518120/article/details/54604615

你可能感兴趣的:(Unity相关,ET,Protobuf,ET学习笔记)