protobuf是google的一个开源项目,可用于以下两种用途:
(1)数据的存储(序列化和反序列化),类似于xml、json等;
(2)制作网络通信协议。
源代码下载地址:https://github.com/mgravell/protobuf-net
开源项目地址如下:https://code.google.com/p/protobuf-net/,下载解压后的目录如下所示,每个文件夹的详细介绍都在最后一个txt文件里面了。
ProtoGen是用来根据***.proto文件生成对应的***.cs文件的,而做数据存储功能只需要用到protobuf-net.dll即可,至于使用哪个版本项目情况决定。下面的例子在Windows平台下新建一个C#的控制台工程,并引入ProtoBufNet\Full\net30\protobuf-net.dll,代码如下所示:
namespace TestProtoBuf
{
[ProtoContract]
public class Address
{
[ProtoMember()]
public string Line1;
[ProtoMember()]
public string Line2;
}
[ProtoContract]
public class Person
{
[ProtoMember()]
public int Id;
[ProtoMember()]
public string Name;
[ProtoMember()]
public Address Addr;
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Id = ;
person.Name = "First";
person.Addr = new Address { Line1="line1", Line2="line2"};
// ProtoBuf序列化
using(var file = System.IO.File.Create("Person.bin"))
{
ProtoBuf.Serializer.Serialize(file, person);
}
// ProtoBuf反序列化
Person binPerson = null;
using(var file = System.IO.File.OpenRead("Person.bin"))
{
binPerson = ProtoBuf.Serializer.Deserialize<Person>(file);
}
System.Console.WriteLine(binPerson.Name);
}
}
}
可以看到序列化和反序列化的代码非常简单。
protobuf提供了一种proto脚本用来编写***.proto文件,这种脚本格式简单、可读性强、方便扩展,用proto脚本定义网络协议是非常好用的。
下面是一个proto脚本的简单例子:
message Person {
required string name=;
required int32 id=;
optional string email=;
enum PhoneType {
MOBILE=;
HOME=;
WORK=;
}
message PhoneNumber {
required string number=;
optional PhoneType type= [default=HOME];
}
repeated PhoneNumber phone=;
}
requied是必须有的字段、optional是可有可无的字段、repeated是可以重复的字段(数组或列表),同时枚举字段都必须给出默认值。
接下来就可以使用ProgoGen来根据proto脚本生成源代码cs文件了,命令行如下:
protogen -i:test.proto -0:test.cs -ns:MyProtoBuf
-i指定了输入,-o指定了输出,-ns指定了生成代码的namespace,上面的proto脚本生成的源码如下:
//------------------------------------------------------------------------------
// <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: file/pb.proto
namespace MyProtoBuf
{
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"Person")]
public partial class Person : global::ProtoBuf.IExtensible
{
public Person() {}
private string _name;
[global::ProtoBuf.ProtoMember(, IsRequired = true, Name=@"name", DataFormat = global::ProtoBuf.DataFormat.Default)]
public string name
{
get { return _name; }
set { _name = value; }
}
private int _id;
[global::ProtoBuf.ProtoMember(, IsRequired = true, Name=@"id", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
public int id
{
get { return _id; }
set { _id = value; }
}
private string _email = "";
[global::ProtoBuf.ProtoMember(, IsRequired = false, Name=@"email", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue("")]
public string email
{
get { return _email; }
set { _email = value; }
}
private readonly global::System.Collections.Generic.List<Person.PhoneNumber> _phone = new global::System.Collections.Generic.List<Person.PhoneNumber>();
[global::ProtoBuf.ProtoMember(, Name=@"phone", DataFormat = global::ProtoBuf.DataFormat.Default)]
public global::System.Collections.Generic.List<Person.PhoneNumber> phone
{
get { return _phone; }
}
[global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"PhoneNumber")]
public partial class PhoneNumber : global::ProtoBuf.IExtensible
{
public PhoneNumber() {}
private string _number;
[global::ProtoBuf.ProtoMember(, IsRequired = true, Name=@"number", DataFormat = global::ProtoBuf.DataFormat.Default)]
public string number
{
get { return _number; }
set { _number = value; }
}
private Person.PhoneType _type = Person.PhoneType.HOME;
[global::ProtoBuf.ProtoMember(, IsRequired = false, Name=@"type", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
[global::System.ComponentModel.DefaultValue(Person.PhoneType.HOME)]
public Person.PhoneType type
{
get { return _type; }
set { _type = value; }
}
private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
}
[global::ProtoBuf.ProtoContract(Name=@"PhoneType")]
public enum PhoneType
{
[global::ProtoBuf.ProtoEnum(Name=@"MOBILE", Value=)]
MOBILE = ,
[global::ProtoBuf.ProtoEnum(Name=@"HOME", Value=)]
HOME = ,
[global::ProtoBuf.ProtoEnum(Name=@"WORK", Value=)]
WORK =
}
private global::ProtoBuf.IExtension extensionObject;
global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }
}
}
*********************分割线*********************
最近又玩了一下pbnet,发现pbnet的github工程里面提供了各个版本的protobuf-net的版本,而且需要自己来编译:
aaarticlea/png;base64,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" alt="" />
protobuf-net的实现没有依赖任何.net 4.0的特性,所以net30版本就能提供完整的功能
net30和net20版本唯一的区别:net30支持wcf
每个版本里面包含三个文件:
protobuf-net.dll:库文件,需要放到应用工程里面的
protobuf-net.xml:IDE使用的配置
protobuf-net.pdb:deug时使用的symblos,用来定位崩溃之类的问题
版本
|
说明
|
net20 |
regular .NET 2.0 (excludes WCF hooks) |
net30 |
regular .NET 3.0 or above (including 3.5, 4.0, 4.5, ...) |
netcore45 |
windows store apps / windows runtime 4.5 |
sl4 |
silverlight 4 or above |
代码生成工具还是和以前一样:
shell sample:
目录下的每个proto生成对应的cs文件:
FOR /R %%G IN (*.proto) DO ..\ProtoBuf\protogen.exe -i:%%G -o:%%~nG_pb.cs
aaarticlea/png;base64,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" alt="" />
其中ns用来设置namespace,只有在proto里面没有指定namespace才会生效。
不过,proto3.0目前已知支持c#了,所以就可以直接使用官方版本了:
(1)使用源码来编译生成Google.Protobuf.dll;
(2)使用protoc3分析proto生成对应的c#代码。
protoc3生成c#代码的语法,和之前pbnet略有不同:
protoc3 -I=ProtoDir --csharp_out=CSDir ProtoFileName.proto
说明:
ProtoDir为proto定义的目录;
CSDir为生成的对应的***.cs的文件目录;
ProtoFileName.proto就是要生成的proto文件名 。
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- Protobuf使用规范分享
一.Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍.你可以定义自己的数据结构 ...
- java netty socket库和自定义C#socket库利用protobuf进行通信完整实例
之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- protobuf的编译安装
github地址:https://github.com/google/protobuf支持多种语言,有多个语言的版本,本文采用的是在centos7下编译源码进行安装. github上有详细的安装说明: ...
- 编译protobuf的jar文件
1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...
- protobuf学习(2)-相关学习资料
protobuf官方git地址 protobuf官方英文文档 (你懂的需要FQ) protobuf中文翻译文档 protobuf概述 (官方翻译 推荐阅读) protobuf入门 ...
- google protobuf安装与使用
google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...
- c# (ENUM)枚举组合类型的谷歌序列化Protobuf
c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...
- dubbox 增加google-gprc/protobuf支持
好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...
随机推荐
- android: 后台执行的定时任务
Android 中的定时任务一般有两种实现方式,一种是使用 Java API 里提供的 Timer 类, 一种是使用 Android 的 Alarm 机制.这两种方式在多数情况下都能实现类似的效果,但 ...
- LPC43xx SGPIO DMA and Interrupts
The SGPIO output pins SGPIO14 and SGPIO15 can trigger a GPDMA request SGPIO pins SGPIO14 and SGPIO15 ...
- 三、oracle 体系结构
1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracle工作原理: 1).在数据库 ...
- AsyncTask实现断点续传
之前公司里面项目的下载模块都是使用xUtils提供的,最近看了下xUtils的源码,它里面也是使用AsyncTask来执行异步任务的,它的下载也包含了断点续传的功能.这里我自己也使用AsyncTask ...
- Docker实践(5)—资源隔离
Docker使用cgroup实现CPU,内存和磁盘IO等系统资源的限制. CPU Docker现在有2个与CPU资源相关的参数,-c可以指定CPU的占比,--cpuset可以绑定CPU.例如,指定容器 ...
- mac 命令行 安装 需要管理员 权限
Please try running this command again as root/Administrator. sudo chown -R $USER /usr/local
- C#--GDI+的LinearGradientBrush类
命名空间:System.Drawing.Drawing2D LinearGradientBrush对象用颜色线性渐变填充图形.简言之,颜色渐变包含一种在两种指定的颜色之间渐变的颜色,渐变的方向是沿着指 ...
- 用 Mahout 和 Elasticsearch 实现推荐系统
原文地址 本文内容 软件 步骤 控制相关性 总结 参考资料 本文介绍如何用带 Apache Mahout 的 MapR Sandbox for Hadoop 和 Elasticsearch 搭建推荐引 ...
- Java 模板引擎 jetbrick-template
jetbrick-template 是一个新一代 Java 模板引擎,具有高性能和高扩展性. 适合于动态 HTML 页面输出或者代码生成,可替代 JSP 页面或者 Velocity 等模板. 指令和 ...
- Android定位&地图&导航——基于百度地图移动获取位置和自动定位
一.问题描述 使用百度地图实现如图所示应用,首先自动定位当前我起始位置(小圆点位置),并跟随移动不断自动定位我的当前位置 百度Api不同版本使用会有些差异,本例中加入lib如下: 二.编写MyAppl ...