C#之ProtoBuf应用基础
protobuf-csharp-sport 的下载地址 : https://github.com/jskeet/protobuf-csharp-port
一 : 准备工作①,将下载的文件解压:
②,开启BuildAll.bat在根目录生成build_output 和 build_temp2个文件夹
(注意使用管理员权限打开BuildAll.bat , 不然会出现错误)
③,在生成的build_output成会生成一系列的工具(在其下的tools文件夹下),介绍如下:
①,将一个proto文件copy到tools文件夹
proto文件内容如下:
package PB;message R_LoginVo{ required string name = 1; required string pwd = 2; required string sign = 3;}message A_LoginVo{ required int32 ty = 1; required ParamVo msg = 2;}message PackingVO{ required bool succ = 1; required string protoId = 2; optional int32 obj = 3;}message ParamVo{ optional string m = 1;}
②,将proto文件生成二进制文件
1,打开命令提示提示符 , 转到tools文件夹(如上).
2,使用命令 : protoc --descriptor_set_out=protocol_pb.protobin --include_imports protocol_pb.proto
可以看到tools文件夹中多了一个 : protocol_pb.protobin文件 , 如下:
3,使用命令:protogen protocol_pb.protobin 将protocol_pb.protobin文件翻译成C#文件 : ProtocolPb.cs , 如下:
可以看出c#文件将中间的_去掉了.这个确实是我始料未及的.
①,将Google.ProtocolBuffers.dll 和 Google.ProtocolBuffers.Serialization.dll 引入到项目,如下
②,将 ProtocolPb.cs文件加入此项目
③,测试(正在使用)
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using PB;namespace ProtoBufDemo{ class Program { static void Main(string[] args) { R_LoginVo.Builder loginBuild = R_LoginVo.CreateBuilder(); loginBuild.SetName("Aonaufly").SetPwd("123456").SetSign("123456789"); Console.WriteLine(@"name : {0} , pwd : {1} , sign : {2}" , loginBuild.Name , loginBuild.Pwd , loginBuild.Sign); byte[] bytes; R_LoginVo login = loginBuild.Build(); using (MemoryStream stream = new MemoryStream()) { //Save the person to a stream login.WriteTo(stream); bytes = stream.ToArray(); } R_LoginVo copy_analysis = R_LoginVo.CreateBuilder().MergeFrom(bytes).Build(); Console.WriteLine(@"name : {0} , pwd : {1} , sign : {2}", copy_analysis.Name, copy_analysis.Pwd, copy_analysis.Sign); bytes = R_LoginVo.CreateBuilder().MergeFrom(bytes).Build().ToByteArray(); Console.ReadKey(); } }}
结果如下:
可以看出 , Google的ProtoBuf在通讯方面确实有很大的优势 :
1,操作简单
2,代码明晰
再也不需要构建复杂的Bytes结构了.
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。