欢迎莅临
人的生命在于折腾,我喜欢折腾我自己~

Protocol Buffers 小记

现在很多协议都是通过PB来压缩和传输,网上的信息并不是特别多,经过我整理,整理一些小技巧,和常用文章。让 Protocol Buffers在C#更容易开发。

第一、简要理解

Protocol buffers 是一种语言中立,平台无关,可扩展的序列化数据的格式,可用于通信协议,数据存储等。

简而言之,PB和Json、XML、C#的序列化,是同一个概念,特点是:

①、速度快

②、体积小

③、多平台

我们可以简单概况就是一个很快的序列化方法,便于跨平台和互联网传输,常用作为各种协议使用。

第二、.proto 文件

Proto文件是描述序列化类的一个文件,按照常规手段我们是需要编写,然而导入各种语言使用。

Proto文件并不复杂,他只是一个描述文件,描述你的协议该怎么写,序列是怎样。每个字段必须告诉他,你是第几位。颇有以前研究外挂封包的时候的的感觉。而确实,他的序列化后的包也是这样子的。

第三、C#上的使用

有两种方法

①、官方的插件,详见 https://github.com/protocolbuffers/protobuf/tree/master/csharp

②、protobuf-net 详见 https://github.com/protobuf-net/protobuf-net

第一种,是可以需要编译.proto文件来获取C#的代码,引入工程后,即可方便使用。但是此文件描述颇为复杂。对于精简的我,不太喜欢。

第二种,是直接自己创建类文件,添加描述,即可。如果大家都是在.Net平台开发,使用第二种方法来得更便捷。

我们来做一个对比

message Request {
     extensions 100 to max;
     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;
     required string youku =3;
 }

生成代码后为

如果直接使用创建描述文件,和C#序列化无异。类似如下:

是不是差别挺大。

第四、一些参考文章和一些工具

①、在线编译工具 https://protogen.marcgravell.com/

②、protogen 工具,通过离线方式编译.PB文件 https://protogen.marcgravell.com/protogen/protogen%202.3.16.zip

③、Google 官方文档 https://developers.google.com/protocol-buffers/docs/overview 英文

④、IBM中文学习: https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html

⑤、Protobuf 终极教程(GO语言) https://colobu.com/2019/10/03/protobuf-ultimate-tutorial-in-go/#package

⑥、高效的数据压缩编码方式 Protobuf https://halfrost.com/protobuf_encode/

基本上你学习完以上6篇文章,就可以玩转Protocol Buffers。

五、小结

一开始,我对Protocol Buffers兴趣不大,还觉得是一个累赘,在想,为什么还要搞那么复杂,Json或者XMl或者CShap序列化还不好嘛?后来,我觉得我挺喜欢他的。接下来的项目也会尝试引入Protocol Buffers。

赞(0) 打赏
未经允许不得转载:邓子乐的札记 » Protocol Buffers 小记
0

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏