【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 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类文件的更多相关文章
- excel poi 文件导出,支持多sheet、多列自动合并。
参考博客: http://www.oschina.net/code/snippet_565430_15074 增加了多sheet,多列的自动合并. 修改了部分过时方法和导出逻辑. 优化了标题,导出信息 ...
- CI框架 -- 核心文件 之 Output.php(输出类文件)
CI输出类Output.php的功能是将最终web页面发送给浏览器,这里面的东西可能是你用的最少的.你使用装载器加载了一个视图文件, 这个视图文件的内容会自动传递给输出类对象, 然后呢,在方法执行完毕 ...
- c# - 一个.cs类文件里如何建多个类
方法类可以使用 internal 修饰符,意为接口类, 主函数建议添加私有修饰符 private 控制台打印
- C#之改变窗体icon图标、新建类文件、调用dll库
一.改变窗体的图标 没有修改之前为: 修改之后为自己想要的图标: 需要在窗体Form1.cs属性里边添加icon图片文件: 二.新建cs类文件 如下图所示,新建一个类文件,我用于来调用库文件也可以来定 ...
- asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台
分享: 腾讯微博 新浪微博 搜狐微博 网易微博 腾讯朋友 百度贴吧 豆瓣 QQ好友 人人网 作者:王春天 原文地址:http://www.cnblogs.com/spring_ ...
- Vue项目中的文件导出
项目中涉及到文件导出,分xml和excel导出.不同的文件导出格式不同,需要根据文件类型判断导出格式. exportAllData(val){ //全部导出 if(!val){ this.export ...
- Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件
Nginx证书配置:tomcat证书jks文件转nginx证书.cet和key文件1.查看jks文件中的entry. keytool -list -keystore server.jks Enter ...
- Github使用.gitignore文件忽略不必要上传的文件 (转)
原文地址: https://blog.csdn.net/gjy211/article/details/51607347 常用编程语言及各种框架平台下的通用 .gitignore 文件 http ...
- matlab修改文件名和删除某类文件
matlab修改多级文件夹路径下的文件名: % %%%%%%%%%%%%%%批量修改文件名一级文件夹 \路径下直接为文件 % close all;clear all;clc; % path='G:\1 ...
随机推荐
- 速卖通api--发起授权
<? $reqURL_onLine = "https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken/494739 ...
- Linux权限体系总结
总结 1. LINUX9位权限及rwx字符的作用.对应的数字及对应的用户和用户组图解. 2. rwx对文件来说代表什么意思. 3. rwx对目录来说代表什么意思. 4. 企业生产环境目录设置权 ...
- 利用toString做类型的判断
//利用toString做类型的判断 : /*var arr = []; alert( Object.prototype.toString.call(arr) == '[object Array]' ...
- bootstrap上传表单的时候上传的数据默认是0 一定要小心
bootstrap上传表单的时候上传的数据默认是0 一定要小心
- oracle删除用户所有表
在删除数据表的时候往往遇到外键约束无法删除的情况,我们可以通过以下几步将数据库表删除,建议在删除库之前先对数据库进行备份,养成良好习惯. 1.删除外键 --查询用户所有表的外键,owner条件为use ...
- gulp 之一 安装及简单CSS,JS文件合并压缩
最近研究了一下gulp构建工具,发现使用起来比grunt顺手一些.(个人感受),以下是grunt和gulp构建方式和原理: grunt 基于文件方式构建,会把文件先写到临时目录下,然后进行读文件,修改 ...
- Centos6.5最小化安装:配置网络和自启动服务
参考http://www.111cn.net/sys/CentOS/56456.htm 1.开启网络连接,禁止IPV6启用 1.开启网络连接 vi /etc/sysconfig/network-sc ...
- 精通 Oracle+Python,第 2 部分:处理时间和日期
从 Python 2.4 版开始,cx_Oracle 自身可以处理 DATE 和 TIMESTAMP 数据类型,将这些列的值映射到 Python 的 datetime 模块的 datetime 对象中 ...
- python基础之列表常用操作及知识点小结
列表(list) List(列表) 是 Python 中使用最频繁的数据类型.列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(所谓嵌套).列表用[ ]标识,是pyth ...
- 浅析tornado web框架
tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Py ...