下载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文件、序列化与反序列化。