通讯协议及Google.Protobuf(三)生成c#代码 序列及反序列化

下载protoc.exe 用于生成c# 代码,地址:https://github.com/protocolbuffers/protobuf/releases

下载的版本最好和Google.Protobuf.dll 版本一致。

解压之后,我们在bin目录下编写一个简单的test1.proto:

1 syntax = "proto3";
2 //package TestProto;  根据实际情况是否需要命名空间
3 
4 message test1
5 {
6     string name = 1;//姓名
7     int32 age = 2;//年龄
8     string sex = 3;//性别
9 }

在protoc-3.7.0-win32文件夹同级目录下我们编写2个批处理文件

 

 exportProto.bat:用于导出proto协议文件,会调用 createProto.bat

@echo off

setlocal enabledelayedexpansion 
set curPath=I:\protobuf\protobufCreateCSharpSourcePackages
cd /d %curPath%
call createProto.bat
pause

createProto.bat:用于最终生成c#、pb文件(pb用于lua 会面我们会将),生成的c#/、pb文件会存放在cSharpProto 、pbProto文件夹内

@echo off

set cSharpPath = protoc-3.7.0-win32\bin\cSharpProto
set pbPath = protoc-3.7.0-win32\bin\pbProto

if not exist %pbPath (
    md protoc-3.7.0-win32\bin\pbProto
) else (
    echo pbProto is Exist
)

if not exist %cSharpPath (
    md protoc-3.7.0-win32\bin\cSharpProto
) else (
    echo cSharpProto is Exist
)

cd protoc-3.7.0-win32\bin
for %%i in (*.proto) do (
    protoc --csharp_out=./ %%i
    protoc -o %%~ni.pb %%i    
    echo From %%i To %%~ni.cs Successfully!
    echo From %%i To %%~ni.pb Successfully!
    move %%~ni.cs cSharpProto
    move %%~ni.pb pbProto
)

使用的时候:只需要双击exportProto.bat即可

结果如下:

 

 

 至此生成代码完成。

把生成的c#代码 导入到我们unity工程中,测试序列化及反序列化:

1 test1 proto3 = new test1();
2 proto3.Age = 10;
3 proto3.Sex = "girl";
4 proto3.Name = "xiaoming";
5 msgData = proto3.ToByteArray();
6 Debug.LogError("msgData .Length = " + msgData.Length);//打印长度 18

注意:这里的转化为byte数组,长度只有18  比 通讯协议及Google.Protobuf(一)中我们自定义struct 数据大小要小。

ToByteArray():这里要引入using Google.Protobuf; 用的是Google.Protobuf 里面的接口。

反序列化:

1 test1 protoMsg = test1.Parser.ParseFrom(msgData);
2 string name1 = protoMsg.Name;
3 int age1 = protoMsg.Age;
4 string Sex1 = protoMsg.Sex;
5 Debug.LogError(string.Format("name1 = {0},age1={1},JobId1 ={2}", name1, age1, Sex1));

Parser.ParseFrom 也是Google.Protobuf.dll 为我们提供的接口。

感兴趣的朋友可以下载源码,源码里面有个例子,可以查看。地址还是上面的地址,下载c#版 。

 

 

总结:

1.使用Google.Protobuf,序列化后的数据包 相对struct  更小。

2.使用Google.Protobuf 更省心。不用写协议生成工具,只需写批处理即可。比如 协议内的数组 ,Protobuf 已有关键字支持。

 

关于 通讯协议及Google.Protobuf c#版本就到此结束了,后面我们会讲解在lua中如何使用pb文件、序列化与反序列化。

posted @ 2022-06-18 15:22  赵不灰  阅读(1862)  评论(0编辑  收藏  举报