C#之ProtoBuf應用基礎

protobuf-csharp-sport 的下載地址 : https://github.com/jskeet/protobuf-csharp-port

一 : 準備工作

①,將下載的文件解壓:

C#之ProtoBuf應用基礎
②,開啓BuildAll.bat在根目錄生成build_output 和 build_temp2個文件夾
(注意使用管理員權限打開BuildAll.bat , 不然會出現錯誤)
C#之ProtoBuf應用基礎
③,在生成的build_output成會生成一系列的工具(在其下的tools文件夾下),介紹如下:
C#之ProtoBuf應用基礎

二 : 生成C#文件

①,將一個proto文件copy到tools文件夾
C#之ProtoBuf應用基礎
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文件 , 如下:
C#之ProtoBuf應用基礎
3,使用命令:protogen protocol_pb.protobin 將protocol_pb.protobin文件翻譯成C#文件 : ProtocolPb.cs , 如下:
C#之ProtoBuf應用基礎
可以看出c#文件將中間的_去掉了.這個確實是我始料未及的.

三 : 使用C#資源

①,將Google.ProtocolBuffers.dll 和 Google.ProtocolBuffers.Serialization.dll 引入到項目,如下
C#之ProtoBuf應用基礎
②,將 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();
        }
    }
}

結果如下:
C#之ProtoBuf應用基礎
可以看出 , Google的ProtoBuf在通訊方面確實有很大的優勢 :
1,操作簡單
2,代碼明晰
再也不需要構建複雜的Bytes結構了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章