C#下使用protobuf(Google Protocol Buffers)

Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。除了比Json、XML有速度上的优势和使用上的方便外,protocolbuf还可以做到向前兼容和向后兼容。

protobuf 虽然只支持JAVA、C++和Pyton,但protobuf社区的protobuf.net组件让protobuf可以支持更多的语言,其中就包括了C#。

protobuf协议

定义protobuf协议必须创建一个以.proto为后缀的文件,以本篇 创建了一个名为myproto.proto的文件,如下:

package ProtoTest;

message TestInfo{
 required string test = 1;
 optional int32 num = 2;
}

message Msg{
 required int32 id = 1;
 optional TestInfo msg = 2;
 optional string str = 3 [defalut="Test String"];
}

package在Java里面代表这个文件所在的包名,在c#里面代表该文件的命名空间,message代表一个类, required 代表该字段必填,optional 代表该字段可选,并可以为其设置默认值,string的默认值格式为[defalut="字符串"]  整型的默认值格式为[defalut=23333]

下面是protobuf在.proto文件中的字段类型转换表:


.proto Type


Notes


C++ Type


Java Type


Python Type[2]


double


double


double


float


float


float


float


float


int32


Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use
sint32 instead.


int32


int


int


int64


Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use
sint64 instead.


int64


long


int/long[3]


uint32


Uses variable-length encoding.


uint32


int[1]


int/long[3]


uint64


Uses variable-length encoding.


uint64


long[1]


int/long[3]


sint32


Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.


int32


int


int


sint64


Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.


int64


long


int/long[3]


fixed32


Always four bytes. More efficient than uint32 if values are often greater than 228.


uint32


int[1]


int


fixed64


Always eight bytes. More efficient than uint64 if values are often greater than 256.


uint64


long[1]


int/long[3]


sfixed32


Always four bytes.


int32


int


int


sfixed64


Always eight bytes.


int64


long


int/long[3]


bool


bool


boolean


boolean


string


A string must always contain UTF-8 encoded or 7-bit ASCII text.


string


String


str/unicode[4]


bytes


May contain any arbitrary sequence of bytes.


string


ByteString


str

如何编译proto文件

在windows如何下载并编译protobuff,这部分参考博客:http://kuaile.in/archives/1214

github仓库地址:https://github.com/google/protobuf

Google下载protobuff下载地址:https://developers.google.com/protocol-buffers/docs/downloads。

在解压后的文件夹中,打开vsprojects目录,目录中的文件如图所示:

分别依次右键编译生成libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib,protoc.exe
 到这里就完成了protobuff的编译。

打开cmd,cd到protoc.exe所在的文件夹,即../vsproject/。假设E:\proto\存在myproto.proto文件。输入

protoc -I=e:\proto --cpp_out=e:\proto e:\proto\myproto.proto

就会在e:\proto
下生成myproto.h 和myproto.cpp文件,测试成功就说明protobuff已经安装成功。

如何将proto文件编译成.cs文件

接下来要将proto文件编译成.cs文件。.net版的protobuf来源于proto社区,有两个版本:

一个版本叫protobuf-net,下载地址为:http://code.google.com/p/protobuf-net/  写法上比较符合c#一贯的写法,而且效率更高。

另一个为protobuf-csharp-sport , 官方站点:http://code.google.com/p/protobuf-csharp-port/ 写法上跟java上的使用极其相似,比较遵循Google 的原生态写法,跨平台选择此版本比较好。

这里使用的是protobuf-net,下载解压后,将Precompile\precompile.exe
以及 ProtoGen\protogen.exe 两个文件加入到环境变量中,打开cmd,使用方法如下:

//使用方法为:
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

以E:\proto\myproto.proto为例,cmd下输入

protogen -i:e:\proto\myproto.proto -o:myproto.cs

运行成功后就会在文件夹内生成myproto.cs文件

如何将myproto.cs加入你的项目中

有两种方法可以将.cs文件加入到你的项目中:第一种就是预编译成.dll文件,然后加入到你的项目中就可以了。第二种就是直接使用源码(这样的话编译速度会比较慢),将你的.cs文件直接加入到你的项目中,然后在项目中引用protobuf-net.dll的库,就可以使用了。

参考文章:

在ios android设备上使用 Protobuf (使用源码方式)  http://game.ceeger.com/forum/read.php?tid=14359&fid=27&page=1

android与PC,C#与Java利用protobuf 进行无障碍通讯 http://www.cnblogs.com/TerryBlog/archive/2011/04/23/2025654.html

windows下Google Protocol Buffer 编译安装教程 http://kuaile.in/archives/1214

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 04:30:05

C#下使用protobuf(Google Protocol Buffers)的相关文章

Google Protocol Buffers 入门

1. 前言 这篇入门教程是基于Java语言的,这篇文章我们将会: 创建一个.proto文件,在其内定义一些PB message 使用PB编译器 使用PB Java API 读写数据 这篇文章仅是入门手册,如果想深入学习及了解,可以参看: Protocol Buffer Language Guide, Java API Reference, Java Generated Code Guide, 以及Encoding Reference. 2. 为什么使用Protocol Buffers 接下来用“

Google Protocol Buffers 编码(Encoding)

Google Protocol Buffers 编码(Encoding) 1. 概述 前三篇文章<Google Protocol Buffers 概述><Google Protocol Buffers 入门><Protocol Buffers 语法指南> 一步一步将大家带入Protocol Buffers的世界,我们已经基本能够使用Protocol Buffers生成代码,编码,解析,输出级读入序列化数据.该篇主要讲述PB message的底层二进制格式.不了解该部分内

Google Protocol Buffers 快速入门(带生成C#源码的方法)

Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助. Protocol Buffers入门:1.去 http://code.google.com/p/protobuf/downloads/list 下载一个源代码包和一个已编译好的二进制包2.找一个Proto示例代码,使用命令 protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbo

Google Protocol Buffers 概述 转

Google Protocol Buffers 概述 个人小站,正在持续整理中,欢迎访问:http://shitouer.cn 小站博文地址:Google Protocol Buffers 概述 推荐阅读顺序,希望给你带来收获~ <Google Protocol Buffers 概述> <Google Protocol Buffers 入门> <Protocol Buffers 语法指南> <Google Protocol Buffers 编码(Encoding)

ProtoBuf.js – Protocol Buffers的Javascript实现(转)

原文链接:ProtoBuf.js – Protocol Buffers的Javascript实现 推荐前端网址:http://keenwon.com/ 在Javascript里比较常见的数据格式就是json,xml,但是这两种格式在数据传输方面有明显不足.而Protocol Buffers可以很好的解决这个问题,下面引用百科的对Protocol Buffers的定义: Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通

Google protocol buffers 小结(二)

protobuf是什么 protobuf,全称Google protocol buffer,Google公司内部的混合语言数据标准,用于RPC系统和持续数据存储系统 它是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化,适合做数据存储或RPC数据交换格式,可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列化结构数据格式.目前提供了 C++.Java.Python三种语言的 API 为什么要使用protobuf 提到protobuf,一般会与XML做比较,pr

DELPHI、FLASH、AS3、FLEX使用Protobuf(google Protocol Buffers)的具体方法

最近因为工作需要,需要在不同的开发环境中应用Protobuf,特此,我专门研究了一下.为了防止自己忘记这些事情,现在记录在这里!需要的朋友可以借鉴一些,因为这些东西在GOOGLE和百度上搜索起来真的很费劲! 一.首先说DELPHI的. 因为DELPHI现在用的人不多了,所以找这个东西真心不好找!还好,加了几个QQ群,有用过的朋友告诉了我! 具体步骤如下: 1.下载DELPHI使用Protobuf需要的项目. 地址在这里:http://sourceforge.NET/projects/fundem

Protocol Buffers 语法指南

前两篇文章,我们概括介绍<Google Protocol Buffers 概述>以及带领大家简单的<Google Protocol Buffers 入门>,接下来,再稍微详细一点介绍Protocol Buffers书写语言.该篇文章主要讲解如何使用PB语言构建数据,包括.proto文件语法及如果使用.proto文件生成数据存取类. 本篇主要包括: 定义一个PB message类型 介绍PB 数据类型 Optional字段及其默认值 枚举类型 使用其他Message类型作为filed

java&amp;Protocol Buffers

ps: Protocol Buffers简称PB PB 安装配置 下载 PB: 在 PB 官网,下载最新版(或者其他版本)PB,这里为了与 Java 项目中的 PB Maven 依赖版本一致,使用 PB 2.5.0 版本. 安装 PB: 解压:tar zxvf protobuf-2.5.0.tar.gz,使用 cd 命令进入 protobuf-2.5.0 目录. ./configure,通常建议加上 --prefix 参数来指定目录,例如:./configure --prefix=/usr/lo