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 to max;
enum Type {
LOGIN = ;
CHANGE_PASSWORD = ;
START_SCALE = ;
STOP_SCALE = ;
DATA_PPG = ;
DATA_EP = ;
DATA_HRV = ;
DATA_IBI = ;
MARK_SCALE = ;
RESOURCE_LIST = ;
UPDATE_USER_INFO = ;
GET_SCALE_LIST = ;
GET_SCALE = ;
}
required Type type = ;
optional string timestamp = ;
}

然后下载导出工具 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(, 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(, 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=)]
LOGIN = , [global::ProtoBuf.ProtoEnum(Name=@"CHANGE_PASSWORD", Value=)]
CHANGE_PASSWORD = , [global::ProtoBuf.ProtoEnum(Name=@"START_SCALE", Value=)]
START_SCALE = , [global::ProtoBuf.ProtoEnum(Name=@"STOP_SCALE", Value=)]
STOP_SCALE = , [global::ProtoBuf.ProtoEnum(Name=@"DATA_PPG", Value=)]
DATA_PPG = , [global::ProtoBuf.ProtoEnum(Name=@"DATA_EP", Value=)]
DATA_EP = , [global::ProtoBuf.ProtoEnum(Name=@"DATA_HRV", Value=)]
DATA_HRV = , [global::ProtoBuf.ProtoEnum(Name=@"DATA_IBI", Value=)]
DATA_IBI = , [global::ProtoBuf.ProtoEnum(Name=@"MARK_SCALE", Value=)]
MARK_SCALE = , [global::ProtoBuf.ProtoEnum(Name=@"RESOURCE_LIST", Value=)]
RESOURCE_LIST = , [global::ProtoBuf.ProtoEnum(Name=@"UPDATE_USER_INFO", Value=)]
UPDATE_USER_INFO = , [global::ProtoBuf.ProtoEnum(Name=@"GET_SCALE_LIST", Value=)]
GET_SCALE_LIST = , [global::ProtoBuf.ProtoEnum(Name=@"GET_SCALE", Value=)]
GET_SCALE =
} private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
} }

但是这样一个一个的用命令行导出实在太麻烦,作为会偷懒的程序员,我们要使用更快速的方式批量生成,这个时候我们想到了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给这种垃圾排前面,狼狈为奸,百毒真的是名不虚传。

【protobuf进阶】通过.proto文件导出C#支持的.cs类文件的更多相关文章

  1. excel poi 文件导出,支持多sheet、多列自动合并。

    参考博客: http://www.oschina.net/code/snippet_565430_15074 增加了多sheet,多列的自动合并. 修改了部分过时方法和导出逻辑. 优化了标题,导出信息 ...

  2. CI框架 -- 核心文件 之 Output.php(输出类文件)

    CI输出类Output.php的功能是将最终web页面发送给浏览器,这里面的东西可能是你用的最少的.你使用装载器加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢,在方法执行完毕 ...

  3. c# - 一个.cs类文件里如何建多个类

    方法类可以使用 internal 修饰符,意为接口类, 主函数建议添加私有修饰符 private   控制台打印

  4. C#之改变窗体icon图标、新建类文件、调用dll库

    一.改变窗体的图标 没有修改之前为: 修改之后为自己想要的图标: 需要在窗体Form1.cs属性里边添加icon图片文件: 二.新建cs类文件 如下图所示,新建一个类文件,我用于来调用库文件也可以来定 ...

  5. asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台

    分享: 腾讯微博  新浪微博   搜狐微博   网易微博  腾讯朋友  百度贴吧  豆瓣   QQ好友  人人网 作者:王春天  原文地址:http://www.cnblogs.com/spring_ ...

  6. Vue项目中的文件导出

    项目中涉及到文件导出,分xml和excel导出.不同的文件导出格式不同,需要根据文件类型判断导出格式. exportAllData(val){ //全部导出 if(!val){ this.export ...

  7. Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件

    Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件1.查看jks文件中的entry. keytool -list -keystore server.jks Enter ...

  8. Github使用.gitignore文件忽略不必要上传的文件 (转)

    原文地址: https://blog.csdn.net/gjy211/article/details/51607347 常用编程语言及各种框架平台下的通用   .gitignore   文件 http ...

  9. matlab修改文件名和删除某类文件

    matlab修改多级文件夹路径下的文件名: % %%%%%%%%%%%%%%批量修改文件名一级文件夹 \路径下直接为文件 % close all;clear all;clc; % path='G:\1 ...

随机推荐

  1. Windows Phone 之下拉菜单ListPicker

    默认情况下,Visual Studio的ToolBox里没有任何下拉菜单的控件可供使用,虽然可以手工输入代码使用隐藏的ComboBox来实现下拉菜单,但是显示出来的菜单与Metro UI主题不匹配.S ...

  2. TensorFlow和最近发布的slim

    笔者将和大家分享一个结合了TensorFlow和最近发布的slim库的小应用,来实现图像分类.图像标注以及图像分割的任务,围绕着slim展开,包括其理论知识和应用场景. 之前自己尝试过许多其它的库,比 ...

  3. sublime text下载和汉化

    好处就不说了,能认识到这款编辑器,基本上对它有一定的了解了. Sublime Text2是一款开源的软件,不需要注册即可使用(虽然没有注册会有弹窗,但是基本不影响使用). 官方网站:http://ww ...

  4. "git add -A" is equivalent to "git add .; git add -u".

    git add -A stages All git add . stages new and modified, without deleted git add -u stages modified ...

  5. 简单安装python的pip工具模块

    下载最新pip安装包 https://pypi.python.org/pypi/pip#downloads 安装 .tar.gz cd pip-.tar.gz python setup.py inst ...

  6. C语言实现五子棋简单功能

    /******************************************************************** C-4.29-1: 实现五子棋游戏 操作说明:用方向键或者& ...

  7. bzoj 1067: [SCOI2007]降雨量 模擬

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2010  Solved: 503[Submit][Status] ...

  8. 小游戏 Lights Out (关灯) 的求解 —— 异或方程组

    Author : Evensgn  Blog Link : http://www.cnblogs.com/JoeFan/ Article Link : http://www.cnblogs.com/J ...

  9. SAP Crystal Dashboard Design 2011 win7 x64 安装

    suggest: unZip the setup package to C:\dashboard\  (make sure that the path cannot contain non-unico ...

  10. 向Python女神推荐这些年我追过的经典书籍

    http://blog.csdn.net/yueguanghaidao/article/details/10416867 最近"瑞丽模特学Python"的热点牵动了大江南北程序员的 ...