Protocol Buffers 小记

本文最后更新于$day天前,文中所描述的信息可能已发生改变。

现在很多协议都是通过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平台开发,使用第二种方法来得更便捷。

我们来做一个对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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。