zoukankan      html  css  js  c++  java
  • 【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=ProtoGenprotogen.exe
    
     
    %Path%  -i:Request.proto    -o:OpenAPIModelRequest.cs
    
    %Path%  -i:Response.proto    -o:OpenAPIModelResponse.cs
    
    %Path%  -i:UserInfo.proto    -o:OpenAPIModelUserInfo.cs
    
    %Path%  -i:LoginReq.proto    -o:OpenAPIModelLoginReq.cs
    
    %Path%  -i:LoginResp.proto    -o:OpenAPIModelLoginResp.cs
    
    pause

    上面的批处理文件将所有的.proto文件到出成.cs类文件。

    或者直接遍历某个文件夹下的所有.prot文件,全部转换

    @echo off
    
    set Path=ProtoGenprotogen.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给这种垃圾排前面,狼狈为奸,百毒真的是名不虚传。

  • 相关阅读:
    冒泡排序
    跑马(行转列,列转行)
    选择排序
    day06-迭代器
    day05-装饰器作业
    day07-生成器
    day08-内置函数和匿名函数
    day09-正侧表达式
    144-SpringBoot的编码问题?
    143-SprinBoot如何使用Servlet?
  • 原文地址:https://www.cnblogs.com/jhli/p/6139914.html
Copyright © 2011-2022 走看看