一、Protobuf 介绍
Protobuf是google 的一种数据交换的格式,它独立于语言,独立于平台,简单说就是后台、安卓、IOS、PC各端都可以使用这种格式来通信
ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具。XML、JSON 也可以用来存储此类结构化数据,但是使用ProtoBuf表示的数据能更加高效,并且将数据压缩得更小。
优点
protobuf优点就是传输效率快(据说在数据量大的时候,传输效率比xml和json快10-20倍),序列化后体积相比Json和XML很小,支持跨平台多语言,消息格式升级和兼容性还不错,序列化反序列化速度很快。
缺点:
json缺点就是传输效率也不是特别高(比xml快,但比protobuf要慢很多)。
xml缺点就是效率不高,资源消耗过大。
protobuf缺点个人觉得使用不太方便。
原理
ProtoBuf 是通过ProtoBuf编译器将与编程语言无关的特有的 .proto 后缀的数据结构文件编译成各个编程语言(Java,C/C++,Python)专用的类文件,然后通过Google提供的各个编程语言的支持库lib即可调用API。(关于proto结构体怎么编写,可自行查阅文档)
二、 下载 Protocol Buffers 编译器
点击地址按照下图步骤下载
如上图下载 win64.zip 之后解压。 找到 bin 目录 并添加到环境变量。 如下图所示:
环境变量成功之后 打开 cmd 执行 protoc --version 如果显示版本号、则编译器安装成功
三、创建自己的 proto 文件
1、使用vsCode 下载插件 vscode-proto3;
如下图所示直接下载安装即可。 此插件方便我们编写自己的 proto 文件
2、添加Flutter 相关依赖库。
yaml 文件添加依赖如下
protobuf: any
protoc_plugin: any
fixnum: any
3、定义proto 文件
例如我的 proto 文件定义如下
// pb 的版本号、不设置的话默认是 proto2
syntax = "proto3";
// message 是固定格式、 TextMessage 是你的消息名称
message TextMessage {
string methodName = 1; // string 是类型。 methodName 是名称。 1是编号
string content = 2;
string sendVid = 3;
string reveiveVid = 4;
string timeInterval = 5;
}
如上面的注释所示哈、需要注意的是 1、2、3、4、5 是编号。不是对应属性的值。
编号尽量使用 1-15哈。只占一个字节。 大于15就是两个字节。 编号最大为536,870,911
proto文件,必须要以 proto 文后缀名哈。例如我的如下:
4、proto数据类型
这个就不多介绍了,大家都董哈。直接上图
三、PB - dart
proto文件站dart文件哈。我们可以直接转一下试试。
- cd 到你的pb文件所在路径。
- 然后执行
protoc --dart_out=././ WNMessage.proto去帮pb文件转乘dart文件。 如果成功了,并获得如下图所示、那么恭喜你成功了。
如果你没成功,报错了,不要慌,往下看。
‘protoc-gen-dart’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
–dart_out: protoc-gen-dart: Plugin failed with status code 1.
这是因为没有安装 protoc dart插件所致。
按照官方插件的安装指引,在命令行中运行:
pub global activate protoc_plugin
成功之后就可以用上面的命令将 proto 生成 dart 文件。
pub 是dart 的命令。如果你安装了dart 却没有办法使用pub 命令,那说明你没有添加dart环境变量。 如下图所示添加一下。
添加之后在执行
pub global activate protoc_plugin
如果执行之后 protoc_plugin 安装成功了, 使用protoc --dart_out=././ WNMessage.proto 转文件的时候还是包错。 说明 protoc_plugin 没有添加环境变量。终端会有warning提醒。 复制路径,然后添加到自己的环境变量。如我的如下:
最后在使用 protoc --dart_out=././ WNMessage.proto
应该就可以获得自己的 proto - dart 文件了。
四、编译反编译
我们费了这么大力气、无非就是为了实现:
-
1、帮我们的dart 对象转成 pb 传给服务器。
-
2、帮服务器的 pb 转乘dart 对象。
如上图所示 既可以序列化、也可以反序列化。 但是记得要导入头文件哈。
import 'package:flutter_share_test/Proto/WNMessage.pb.dart';
参考文献 : www.jianshu.com/p/7f9e8db50… adoontheway.github.io/2019/08/09/…