电脑耳机插前面没声音在电脑后面和前面一样吗

1262人阅读
ProtoBuf在Google Code上的主页是:,
感兴趣的朋友可以在这里下载ProtoBuf的源码,
也可以在这里阅读ProtoBuf的详细的文档。
废话不多说,此文主要是记录如何把.proto文件快速生成我们需要.cs文件,以及如何在C#项目使用protobuf,至于剩下的序列化和反
序列化网上教程就很多了。
& &首先新建一个.net framework 4.5的工程项目,然后为你的新项目添加Google Protocol Buffers C#&NuGet
package,添加NuGet
package的方法请看网页。
安装完成后,你的项目文件夹会自动生成一个packages文件夹,在目录packages\Google.Protobuf.3.0.0-beta2\lib\dotnet里
面会有项目需要的Google.Protobuf.dll文件,而在packages\Google.Protobuf.3.0.0-beta2\tools里面会包含我们用来编译.proto文件为
.cs文件的工具protoc.exe。有了它我们就可以打开系统命令行工具,定位到protoc.exe的目录,然后运行如下命令即可完成:
protoc -I=$SRC_DIR --csharp_out=$DST_DIR $SRC_DIR/addressbook.proto &(注:$SRC_DIR
需要换成你自己的.proto文件所在的目录地址)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6281次
排名:千里之外
(1)(1)(2)(1)(1)自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
github上相关开源项目代码:
下面演示如何将protobuf的消息体导出成C#支持的.cs类
首先我们获取到如下.proto文件
option java_package = "com.******.****.***.protobuf";
option java_outer_classname = "RequestProto";
message Request {
extensions 100
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 下载地址:&
通过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文件内容如下
&View Code
但是这样一个一个的用命令行导出实在太麻烦,作为会偷懒的程序员,我们要使用更快速的方式批量生成,这个时候我们想到了BAT批处理
set Path=ProtoGen\protogen.exe
-i:Request.proto
-o:OpenAPIModel\Request.cs
-i:Response.proto
-o:OpenAPIModel\Response.cs
-i:UserInfo.proto
-o:OpenAPIModel\UserInfo.cs
-i:LoginReq.proto
-o:OpenAPIModel\LoginReq.cs
-i:LoginResp.proto
-o:OpenAPIModel\LoginResp.cs
上面的批处理文件将所有的.proto文件到出成.cs类文件。
或者直接遍历某个文件夹下的所有.prot文件,全部转换
set Path=ProtoGen\protogen.exe
for /f "delims=" %%i in ('dir /b proto "proto/*.proto"') do %Path% -i:proto/%%i -o:cs/%%~ni.cs
以上BAT以及demo的下载地址:
简介&&Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言。&支持多种编程语言,现:、c#、c++、&和&。&基于二进制,因此比传统的XML表示高效短小得多&作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。&使用
1、下载地址:
2、proto文件格式
package 对应于c#中的命名空间&required 对应类的属性&optional 创建一个具有默认值的属性,通过[default=XXX]设置默认值,不添加默认为空置。如string默认为“”,int默认为0&enum 创建枚举&message 创建自定义类或内部类&repeated 对应list列表数据&proto数据类型:&&示例:
message Person {
required string name=1;
required int32 id=2;
optional string email=3 ;
enum PhoneType {
message PhoneNumber {
required string number=1;
optional PhoneType type=2 [default=HOME];
repeated PhoneNumber phone=4;
proto文件编辑的命令:&protogen -i:input.proto -o:output.cs&protogen -i:input.proto -o:output.xml -t:xml&protogen -i:input.proto -o:output.cs -p:datacontract -q&protogen -i:input.proto -o:output.cs -p:observable=true
转换之后的文件:
3、proto转化后的.cs文件的序列化和反序列化
首先,将生成的.cs文件复制到自己的项目文件中&然后添加动态链接库文件protobuf-net.dll(该文件位于下载的proto文件的protobuf-net_r668\ProtoGen目录下)&然后在程序中引用,相关程序如下:
using System.Collections.G
using System.L
using System.T
using System.Threading.T
using ProtoB
using input.
using System.IO;
using System.Runtime.Serialization.Formatters.B
namespace test1
class Program
static void Main(string[] args)
Person p = new Person();
p.name = "zhang san";
p.email = "";
p.id = 12;
阅读(...) 评论()
随笔 - 15961
评论 - 1322Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。它支持多种语言,比如C++,Java,C#,Python,JavaScript等等。目前它的最新版本是。与PB经常相提并论的也是Google推出的FlatBuffers(下面简称FB)。有关PB和FB性能和语义等方面的区别,这里就不展开描述了。如果有兴趣,可以参阅下面的信息:
目前很多公司在一些高性能的通信场景下,会越来越多的选择用PB或者FB来替代我们常用的Json。比如说Windows Phone的微信的SDK就用到了。
反编译微信SDK
PB对C#官方的支持是从3.0开始的,之前的1.0和2.0的版本都能找到一些非官方的版本。我们先反编译一下微信的SDK,看下它具体是什么版本的。
首先,我们从微信的官网下载SDK:
登陆微信开发平台,进入资源中心,选择WP8资源下载,点击下载。
然后下载我们的反编译工具。
解压下载完成的ILSpy和SDK包,用ILSpy.exe打开MicroMsgSDK.dll。
我们暂时先不管这个结构到底是怎么来的,我们可以看到反编译出来的文件带了ProtoGen的版本号,我们尝试从Github上找到这个版本号的代码。
编译ProtoBuffer源码
我们先打开官方的C#版本的PB的源码页面:。
可以看到官方地址只保留了3.0的版本,对于旧的2.0版本的代码在的账号下,
我们点开这个仓库,然后找到它的页面:
我们找到2.3.0.277的源码并下载到本地。
解压文件,我们看到Build文件夹下有一堆编译用的脚本:
双击运行buildAll.bat(此处应确保本机已经安装了Visual Studio 2008及以上版本),然后等待编译完成。
尝试使用源码中的Proto文件生成cs代码
我们找到ProtoGen项目中生成的exe文件,尝试将它放到命令行中运行:
它提示我们找不到protoc.exe程序。我们回到源码的根目录会发现有一个lib的文件夹,里面有一个protoc.exe的程序。所以我们尝试吧ProtoGen项目的所有生成文件拷贝到lib下。
继续尝试运行我们的ProtoGen程序。
这回对了,我们尝试把源码下的protos文件夹下的三个子文件夹拷贝到我们的lib目录下。
我们尝试输入如下内容:
protogen --proto_path==protos protos/tutorial/addressbook.proto
又得到一个错误信息:
提示我们找不到依赖,我们尝试打开proto文件:(有关PB的语法请参阅:)
import &google/protobuf/csharp_options.proto&;
option (google.protobuf.csharp_file_options).namespace = &Google.ProtocolBuffers.Examples.AddressBook&;
option (google.protobuf.csharp_file_options).umbrella_classname = &AddressBookProtos&;
option optimize_for = SPEED;
message Person {
required string name = 1;
required int32 id = 2;
// Unique ID number for this person.
optional string email = 3;
enum PhoneType {
MOBILE = 0;
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
repeated PhoneNumber phone = 4;
// Our address book file is just one of these.
message AddressBook {
repeated Person person = 1;
我们可以看到导入了google/protobuf/csharp_options.proto文件,我们回头看protogen的命令参数中有一个import的标记,我们尝试添加:
protogen --proto_path==protos protos/tutorial/addressbook.proto --include_imports=google/protobuf/csharp_options.proto
没有任何错误,并且我们在lib的目录下发现了生成的cs文件。
从cs文件反推proto文件
我们打开AddressBookProtos文件,阅读源码发现:
只有两个非静态类,与我们Proto文件中的Person和AddressBook对应:
Person类中又有一个嵌套的枚举和类,与PhoneType和PhoneNumber对应:
我们有发现,在类的IsInitialized中,Name和Id等required的有是否有值得判断,所以我们能区分去required和optional
其他依赖信息,我们可以通过引用来查找。
从反编译的微信文件中反推proto文件
我们以BaseReqP为例。首先,没有using,所以我们确定没有其他的Proto文件的依赖。我们只发现一个类,所以说明它只有一条message,名称就是BaseReqP,然后包名是MicroMsg.sdk.protobuf。
我们知道message的所有字段是需要标记数字的:
从这里我们又反推出,message有两个字段:Transaction和Type,它们类型分别是string和uint。
接下来我们推是否是必须的。找到我们的IsInitialized:
从这里我们就知道了两个字段都是必须的。所以综合上述信息,我们可以写出的proto文件如下:
package MicroMsg.sdk.
message BaseReqP {
required uint32 Type = 1;
required string Transaction = 2;
本篇内容简要介绍了ProtoBuffer的文件如何生成C#文件,并简单的举例如何从C#文件反推Proto文件。
阅读(...) 评论()trackbacks-0
Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助。
Protocol Buffers入门:
1、去 &下载一个源代码包和一个已编译好的二进制包
2、找一个Proto示例代码,使用命令
protoc&-I=$SRC_DIR&--java_out=$DST_DIR&$SRC_DIR/addressbook.proto
将proto文件编译一下即可得到对应的Java源代码。例如 protoc&-I=src --java_out=addressbook.proto。
Java项目配置:
&&&& $ protoc --java_out=src/main/java -I../src ../src/google/protobuf/descriptor.proto
&&&&&命令把源代码包中的descriptor.proto编译一下,生成一个类。
2、将第一步生成的那个文件连同源代码包中的java/src/main/java中的源代码,一起丢入你的项目工程,这就是基础类库了。
3、之后你就可以写自己的proto文件,然后编译,连同上面的基础类库丢入你的项目工程中,就可以运行了。
C#的配置:
1、Google本身不自带生成C#源码的功能,要使用C#,必须使用一个Csharp port,项目地址是:/p/protobuf-csharp-port/
2、源码可以从SVN上面Download下来,Download下来之后,需要去下载一个NAnt,然后在项目源码目录下进行命令操作,用来编译生成可执行文件
nant&clean&build&test&dist
这步做完会生成几个文件:
- the source code generator
Google.ProtocolBuffers.dll - the library part of the project
- tool to remove sensitive data from binary messages
- tool to dump a binary message as text
- tool to run performance benchmarks on binary messages
主要是第一个和第二个
第一个ProtoGen.exe是用来生成C#源码的
第二个Google.ProtocolBuffers.dll是用来在项目中进行引用的。
3、在源码中附带了记个proto文件,是根据C#版本专门修改过的,可以拿出来做生成测试,执行以下命令可以得到C#源文件:
protoc&--descriptor_set_out=addressbook.protobin&--proto_path=protos&--include_imports&protos\tutorial\addressbook.proto&
protogen&addressbook.protobin
如果想生成C#源码,需要执行第一步将源文件用Protoc编译一下,编译之后再用Protogen生成一份C#文件,会生成三个文件,只有AddressBookProtos.cs有用,将这个文件连同Google.ProtocolBuffers.dll一起丢入项目,你就可以使用了。
---------------------------------------------------------
专注移动开发
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
阅读(9923)
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
您好,有个问题请教,就是有个项目采用“java 手机客户端、C++服务器”,C++服务器的协议是用结构体定义的,java客户端解析起来很不方便。
请问能否用Google Protocol Buffers呢,这样就不用人工解析消息格式了,望指教。
我的联系方式:qq:&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@YYXZ
你可以看下,我记得好像c++是生成类文件,只要稍作修改就可以使用了,如果客户端测试方便,那稍微修改下也很好。或者你就自定义协议来传输&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@TiGERTiAN
“自定义协议”怎么讲?&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@YYXZ
你可以用json,xml等等来拼凑自己的协议,然后上客户端去解析&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@TiGERTiAN
哦,谢谢您的解答。
另外一个问题,使用Google Protocol Buffers生成的协议,比用C++定义的结构体消息是不是更小些,传输起来是不是更节省带宽呢,因为客户端是手机,越节省越好了。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@YYXZ
你是什么意思?你c++用结构体的话传输到客户端肯定要有自己协议的,google生成的东西里面会加一些他自己的格式在里面,但是加的很少。google的协议大小不一定比你自定义的小很多,但是解析起来肯定比你的快和方便。因为他是从二进制直接转换成对象,中间的处理已经尽量做到高效了。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@TiGERTiAN
是这样的,目前C++服务器用结构体定义的协议,发送到java手机客户端,需要自己解析,还得考虑内存对齐问题,效率太低了。考虑采用Protocol Buffers,这样会提高效率吧 &&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@YYXZ
实在不行就用xml也可以,不需要考虑这些,直接线性解析xml文本,效率跟速度都不会慢,只是需要修改架构了。用buffers也要重新写协议,做之前,最好在j2me上面重新测试下buffers的性能和可用性。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@TiGERTiAN
嗯,好的,再次谢谢您的解答。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
@YYXZ
不客气,互相帮助哈。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
我觉得有两种方式:1、用Protocol Buffers,就是不知道生成的JAVA代码在j2me下能不能运行。 2、用JSON做消息格式,然后压缩传输。客户端收到再解压。这个需要自己实现消息头,然后在解析消息体,稍微麻烦些,不过消息解析可以用现成的库(因为Java有现成的解析JSON的库)。而且由于压缩的缘故,流量可以很小,如果可能要比用Protocal BUffers复杂。 你用结构体的意思应该是把内存块直接传给JAVA客户端了,JAVA对于二进制操作远没有C++方便,而且结构体中有很多内存区域并没有数据,拜拜浪费流量。而且如果要传递就够提就必须保证结构体内存连续,这样结构体中就不能使用复杂的数据结构,多不爽啊。还是用JSON或PB好。&&&&&&
&re: Google Protocol Buffers 快速入门(带生成C#源码的方法)
c# 配置的时候,你这些命令都是在什么地方输入的啊。&&&&&&
2627282930311234567891011121314161819202223242526272829303112345
留言簿(39)
随笔分类(402)
随笔档案(306)
我的好友们
积分与排名
阅读排行榜
评论排行榜

我要回帖

更多关于 电脑耳机插前面没声音 的文章

 

随机推荐