Flutter - protobuf转dart

3,389 阅读4分钟

一、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结构体怎么编写,可自行查阅文档)

11.png

二、 下载 Protocol Buffers 编译器

地址 :github.com/protocolbuf…

点击地址按照下图步骤下载 901.png

902.png

如上图下载 win64.zip 之后解压。 找到 bin 目录 并添加到环境变量。 如下图所示:

903.png

环境变量成功之后 打开 cmd 执行 protoc --version 如果显示版本号、则编译器安装成功

image.png

三、创建自己的 proto 文件

1、使用vsCode 下载插件 vscode-proto3;

如下图所示直接下载安装即可。 此插件方便我们编写自己的 proto 文件

111.png

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 文后缀名哈。例如我的如下: 905.png

4、proto数据类型

这个就不多介绍了,大家都董哈。直接上图

4.png

44.png

三、PB - dart

proto文件站dart文件哈。我们可以直接转一下试试。

  • cd 到你的pb文件所在路径。
  • 然后执行 protoc --dart_out=././ WNMessage.proto 去帮pb文件转乘dart文件。 如果成功了,并获得如下图所示、那么恭喜你成功了。

907.png

如果你没成功,报错了,不要慌,往下看。

‘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环境变量。 如下图所示添加一下。

image.png

添加之后在执行

pub global activate protoc_plugin

如果执行之后 protoc_plugin 安装成功了, 使用protoc --dart_out=././ WNMessage.proto 转文件的时候还是包错。 说明 protoc_plugin 没有添加环境变量。终端会有warning提醒。 复制路径,然后添加到自己的环境变量。如我的如下:

image.png

最后在使用 protoc --dart_out=././ WNMessage.proto 应该就可以获得自己的 proto - dart 文件了。

四、编译反编译

我们费了这么大力气、无非就是为了实现:

  • 1、帮我们的dart 对象转成 pb 传给服务器。

  • 2、帮服务器的 pb 转乘dart 对象。

image.png

如上图所示 既可以序列化、也可以反序列化。 但是记得要导入头文件哈。

import 'package:flutter_share_test/Proto/WNMessage.pb.dart';

参考文献 : www.jianshu.com/p/7f9e8db50… adoontheway.github.io/2019/08/09/…