【protobuf進階】通過.proto文件導出C#支持的.cs類文件


protobuf是一個跨平台的消息交互協議,類似xml、json等。

protocolbuffer(以下簡稱PB)是google 的一種數據交換的格式,它獨立於語言,獨立於平台。
google 提供了多種語言的實現:java、c#、c++、go 和 python,每一種實現都包含了相應語言的編譯器以及庫文件。
由於它是一種二進制的格式,比使用xml 進行數據交換快許多。可以把它用於分布式應用之間的數據通信或者異構環境下的數據交換。
作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用於諸如網絡傳輸、配置文件、數據存儲等諸多領域。

github上相關開源項目代碼:http://pan.baidu.com/s/1eSDSb5o

下面演示如何將protobuf的消息體導出成C#支持的.cs類

首先我們獲取到如下.proto文件

package hrv;

option java_package = "com.******.****.***.protobuf";
option java_outer_classname = "RequestProto";

message Request {
    extensions 100 to max;
    enum Type {
        LOGIN = 0;
        CHANGE_PASSWORD = 1;
        START_SCALE = 2;
        STOP_SCALE = 3;
        DATA_PPG = 4;
        DATA_EP = 5;
        DATA_HRV = 6;
        DATA_IBI = 7;
        MARK_SCALE = 8;
        RESOURCE_LIST = 9;
        UPDATE_USER_INFO = 10;
        GET_SCALE_LIST = 11;
        GET_SCALE = 12;
    }
    required Type type = 1;
    optional string timestamp = 2;
}

然后下載導出工具 ProtoGen.exe 下載地址: http://pan.baidu.com/s/1eRIv3oe

通過CMD命令行進入到該目錄

 使用如下命令行導出.cs文件

protogen.exe  -i:Request.proto    -o:Request.cs

命令解釋

protogen -i:test.proto -o:test.cs -ns:UGE.Metadata -p:import=UGE

這句話的意思是, 輸入test.proto文件, 給我生成 test.cs 文件, 代碼在 namespace UGE.Metadata里, 順便引用下 using UGE.

可以看到在同目錄下生成了一個Request.cs文件,這個文件就是我們想要的cs類文件

Request.cs文件內容如下

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

// Generated from: Request.proto
namespace hrv
{
  [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Request")]
  public partial class Request : global::ProtoBuf.IExtensible
  {
    public Request() {}
    
    private hrv.Request.Type _type;
    [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
    public hrv.Request.Type type
    {
      get { return _type; }
      set { _type = value; }
    }

    private string _timestamp = "";
    [global::ProtoBuf.ProtoMember(2, IsRequired = false, Name=@"timestamp", DataFormat = global::ProtoBuf.DataFormat.Default)]
    [global::System.ComponentModel.DefaultValue("")]
    public string timestamp
    {
      get { return _timestamp; }
      set { _timestamp = value; }
    }
    [global::ProtoBuf.ProtoContract(Name=@"Type")]
    public enum Type
    {
            
      [global::ProtoBuf.ProtoEnum(Name=@"LOGIN", Value=0)]
      LOGIN = 0,
            
      [global::ProtoBuf.ProtoEnum(Name=@"CHANGE_PASSWORD", Value=1)]
      CHANGE_PASSWORD = 1,
            
      [global::ProtoBuf.ProtoEnum(Name=@"START_SCALE", Value=2)]
      START_SCALE = 2,
            
      [global::ProtoBuf.ProtoEnum(Name=@"STOP_SCALE", Value=3)]
      STOP_SCALE = 3,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DATA_PPG", Value=4)]
      DATA_PPG = 4,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DATA_EP", Value=5)]
      DATA_EP = 5,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DATA_HRV", Value=6)]
      DATA_HRV = 6,
            
      [global::ProtoBuf.ProtoEnum(Name=@"DATA_IBI", Value=7)]
      DATA_IBI = 7,
            
      [global::ProtoBuf.ProtoEnum(Name=@"MARK_SCALE", Value=8)]
      MARK_SCALE = 8,
            
      [global::ProtoBuf.ProtoEnum(Name=@"RESOURCE_LIST", Value=9)]
      RESOURCE_LIST = 9,
            
      [global::ProtoBuf.ProtoEnum(Name=@"UPDATE_USER_INFO", Value=10)]
      UPDATE_USER_INFO = 10,
            
      [global::ProtoBuf.ProtoEnum(Name=@"GET_SCALE_LIST", Value=11)]
      GET_SCALE_LIST = 11,
            
      [global::ProtoBuf.ProtoEnum(Name=@"GET_SCALE", Value=12)]
      GET_SCALE = 12
    }
  
    private global::ProtoBuf.IExtension extensionObject;
    global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
      { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
  }
  
}
View Code

但是這樣一個一個的用命令行導出實在太麻煩,作為會偷懶的程序員,我們要使用更快速的方式批量生成,這個時候我們想到了BAT批處理

echo on

set Path=ProtoGen\protogen.exe

 
%Path%  -i:Request.proto    -o:OpenAPIModel\Request.cs

%Path%  -i:Response.proto    -o:OpenAPIModel\Response.cs

%Path%  -i:UserInfo.proto    -o:OpenAPIModel\UserInfo.cs

%Path%  -i:LoginReq.proto    -o:OpenAPIModel\LoginReq.cs

%Path%  -i:LoginResp.proto    -o:OpenAPIModel\LoginResp.cs

pause

上面的批處理文件將所有的.proto文件到出成.cs類文件。

或者直接遍歷某個文件夾下的所有.prot文件,全部轉換

@echo off

set Path=ProtoGen\protogen.exe

for /f "delims=" %%i in ('dir /b proto "proto/*.proto"') do %Path% -i:proto/%%i -o:cs/%%~ni.cs

pause

以上BAT以及demo的下載地址:http://pan.baidu.com/s/1pLtWTy7

 搞定!

 

狗比CSDN抄襲,還TM寫原創,真jb不要臉,真是程序員界的恥辱。

關鍵百度還TM給這種垃圾排前面,狼狽為奸,百毒真的是名不虛傳。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM