如何通过Google.Protobuf生成基于特定通讯协议的代码段?

2026-04-28 10:312阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计694个文字,预计阅读时间需要3分钟。

如何通过Google.Protobuf生成基于特定通讯协议的代码段?

下载protoc.exe,用于生成C++代码。

下载protoc.exe 用于生成c# 代码,地址: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():这里要引入usingGoogle.Protobuf; 用的是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文件、序列化与反序列化。

本文共计694个文字,预计阅读时间需要3分钟。

如何通过Google.Protobuf生成基于特定通讯协议的代码段?

下载protoc.exe,用于生成C++代码。

下载protoc.exe 用于生成c# 代码,地址: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():这里要引入usingGoogle.Protobuf; 用的是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文件、序列化与反序列化。