Google Protocol Buffer 用法 C#

来源:互联网 发布:我的世界安装天堂js 编辑:程序博客网 时间:2024/05/03 22:49

在网上查了一下,虽然有很多文章介绍Protocol Buffer,但是实际使用起来,还是会遇到很多问题,所以我想应该有一个指南一样的东西,让新手很快就能使用它。

Protocol Buffer简写为Protobuf,是Google开发的一种储存数据的方式,功能与XML一样,但更方便,数据量更小,速度更快,在序列化和反序列化的时候使用,有很大的优势。比如,网络游戏的通讯协议编写。更重要的是,它是一个开源项目。

 

闲话不多说,下载地址:

http://code.google.com/p/protobuf/downloads/list

 

由于Protobuf不能生成C#代码,所以就要用到另外一个开源项目protobuf-net,下载地址:

http://code.google.com/p/protobuf-net/

 


@echo off
rem 查找文件
for /f "delims=" %%i in ('dir /b ".\*.proto"') do echo %%i
for /f "delims=" %%i in ('dir /b/a "*.proto"') do protoc -I=. --cpp_out=. %%i
for /f "delims=" %%i in ('dir /b/a "*.proto"') do protogen -i:%%i -o:%%~ni.cs
pause


用法是,在命令行用protoc.exe依据你自己定义的.proto文件,来生成.cpp文件

用protobuf-net的protogen.exe来生成.cs文件,可以写一个批处理,如下:

protoc -I=. --cpp_out=. Net.proto     //在当前目录下,以cpp方式编译Net.proto

protogen -i:Net.proto -o:Net.cs        //在当前目录下,用Net.proto生成Net.cs

 

其实两句功能是一样,只是分别生成了Net.proto的cpp文件和cs文件,这样就可以在两种语言编写的应用程序间通信了。

Net.proto文件内容如下:

  1. message SearchRequest {  
  2.   required string query = 1;  
  3.   optional int32 page_number = 2;  
  4.   optional int32 result_per_page = 3;  
  5. }  

 

数据类型如下:

.proto TypeNotesC++ TypeJava Typedouble
doubledoublefloat
floatfloatint32Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.int32intint64Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.int64longuint32Uses variable-length encoding.uint32int[1]uint64Uses variable-length encoding.uint64long[1]sint32Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.int32intsint64Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.int64longfixed32Always four bytes. More efficient than uint32 if values are often greater than 228.uint32int[1]fixed64Always eight bytes. More efficient than uint64 if values are often greater than 256.uint64long[1]sfixed32Always four bytes.int32intsfixed64Always eight bytes.int64longbool
boolbooleanstringA string must always contain UTF-8 encoded or 7-bit ASCII text.stringStringbytesMay contain any arbitrary sequence of bytes.stringByteString
原创粉丝点击