protobuf-net

时间:2022-11-10 19:00:49

  protobuf是google的一个开源项目,可用于以下两种用途:

  (1)数据的存储(序列化和反序列化),类似于xml、json等;

  (2)制作网络通信协议。

  源代码下载地址:https://github.com/mgravell/protobuf-net

  开源项目地址如下:https://code.google.com/p/protobuf-net/,下载解压后的目录如下所示,每个文件夹的详细介绍都在最后一个txt文件里面了。

  protobuf-net

  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文件名 。

protobuf-net的更多相关文章

  1. python通过protobuf实现rpc

    由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...

  2. Protobuf使用规范分享

    一.Protobuf 的优点 Protobuf 有如 XML,不过它更小.更快.也更简单.它以高效的二进制方式存储,比 XML 小 3 到 10 倍,快 20 到 100 倍.你可以定义自己的数据结构 ...

  3. java netty socket库和自定义C&num;socket库利用protobuf进行通信完整实例

    之前的文章讲述了socket通信的一些基本知识,已经本人自定义的C#版本的socket.和java netty 库的二次封装,但是没有真正的发表测试用例. 本文只是为了讲解利用protobuf 进行C ...

  4. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  5. protobuf的编译安装

    github地址:https://github.com/google/protobuf支持多种语言,有多个语言的版本,本文采用的是在centos7下编译源码进行安装. github上有详细的安装说明: ...

  6. 编译protobuf的jar文件

    1.准备工作 需要到github上下载相应的文件,地址https://github.com/google/protobuf/releases protobuf有很多不同语言的版本,因为我们需要的是ja ...

  7. protobuf学习&lpar;2&rpar;-相关学习资料

    protobuf官方git地址 protobuf官方英文文档   (你懂的需要FQ) protobuf中文翻译文档 protobuf概述          (官方翻译 推荐阅读) protobuf入门 ...

  8. google protobuf安装与使用

    google protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.google protobuf是跨语言的,并且自带了一个编译器( ...

  9. c&num; &lpar;ENUM&rpar;枚举组合类型的谷歌序列化Protobuf

    c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...

  10. dubbox 增加google-gprc&sol;protobuf支持

    好久没写东西了,今年实在太忙,基本都在搞业务开发,晚上来补一篇,作为今年的收官博客.google-rpc 正式发布以来,受到了不少人的关注,这么知名的rpc框架,不集成到dubbox中有点说不过去. ...

随机推荐

  1. 【Win10应用开发】自定义磁贴通知的排版

    前面老周用了两篇烂文,向大家介绍了Adaptive磁贴的模板使用.那些XML模板已经很强大了,不过,如果你觉得那些排版还不足以满足需求,不妨试试自己来定义磁贴的内容. 其实,Runtime App支持 ...

  2. springmvc之图片上传

    1.接收到的是图片的流时 //上传头像 @RequestMapping(value = "/uploadHeadSculpture", method = RequestMethod ...

  3. 【log】logback&period;xml

    <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 控制台 - ...

  4. qsort函数、sort函数 &lpar;精心整理篇&rpar;

    先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...

  5. 用JavaScript将Canvas内容转化成图片的方法

    上周我们花了半天时间开发下一个准备放进Mozilla Marketplace的应用.有一个应用现在非常的火热,那就是Instagram,Facebook花了100万美元收购了它.我们也想有100万美元 ...

  6. &lbrack;ios2&rsqb;&lbrack;转&rsqb;iOS摇动检测 &lpar;UIAccelerometer&rpar;

    加速计(UIAccelerometer)是一个单例模式的类,所以需要通过方法sharedAccelerometer获取其唯一的实例. 加速计需要设置的主要有两个: 一个是设置其代理,用以执行获取加速计 ...

  7. CSS&period;05 -- 规避脱标 定位的盒子居中、CSS标签规范、溢出隐藏、内容移除(网页优化)、CSS精灵图

    规避脱标   定位的盒子居中显示 Margin:0 auto : 只能让标准流的盒子居中对齐 当A是B的父系,B可以使用 margin-left:auto: 来获得相当于定位right:0:的效果 M ...

  8. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  9. 如何用python和苹果Turicreate学习框架来识别图像?

    大多数人听到深度学习,都会望而却步,因为会觉得很难,在这个人工智能飞速进步的时代,我也来抓一下时代的尾巴~ 两周前,我开始接触到python和Turicreate框架,经过不懈的努力,终于有所收获,特 ...

  10. Hibernate之持久化状态

    可持久化对象有以下三种状态: 临时状态(Transient):对象在保存进数据库之前为临时状态,这时数据库中没有该对象的信息,如果没有持久化,程序退出后临时状态的对象信息将会丢失.随时可能被垃圾回收器 ...