概述
Protobuf 可以做什么?
Protobuf 全称 Protocol Buffers,根据官网(请自备梯子)的介绍,是一个跨语言数据传输中间件,也就是说可以在不同语言之间通过 Protobuf 来传输数据,然后结合 netty 就能够跨设备跨系统跨语言传输数据了
基本使用流程:
- 根据 Protobuf 的规定编写 *.proto 文件
- 使用 Protobuf 编译器编译 *.proto 文件生成需要的代码格式(Java、Python 等)
- 上面生成的代码在 Java 看来有点像一个 Java Bean,用于存放数据的
- 在不同项目中引入对应的依赖,使用对应的 API 对上面生成“Java Bean”进行创建和赋值
- 使用 Socket 等方式传输序列化的“Java Bean”,进而在不同语言之间传输数据
另外,Protobuf 目前有2和3的版本,区别在于:
- 版本2支持 C++、Java、Python、Go 四中语言,版本3多了 Ruby、C#、PHP
- 版本2和3配置文件(*.proto 文件)的关键字稍有不同,但是语法差不多,都是挺容易懂的
- 其他的一些特性有待挖掘
为什么需要 Protobuf ?
不是有 xml 的方式吗?不是有 json 吗?
相对于 xml 的方式,xml 的不少缺点相信很多人知道(体积大,解析困难),而 Protobuf 的解析速度会更快,数据的体积会更小,所以传输速度会更快
相对于 json 的方式,Protobuf 可以生成固定的数据结构体,相当于帮助我们解析数据了,以及对于数据的操作(创建、赋值等)都非常方便,有效地提高工作效率,当然,Protobuf 也有支持 json 的拓展工具包,一开始学习暂时用不到,就先不了解了
怎么使用 Protobuf ?
先看官方给出的一个版本2的 *.proto 文件的 demo
// 使用 Protobuf 版本2 的语法
syntax = "proto2";
// 生成的代码所在文件夹为 tutorial
package tutorial;
// option 为可选选项,如果是生成 Java 代码的话,这里会是 class 的包
// 如果当前选项不写,会根据上面的 package 来生成
option java_package = "com.example.tutorial";
// 生成的 class 名称
option java_outer_classname = "AddressBookProtos";
// AddressBookProtos 的内部类
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
// Person 的内部枚举类
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
// Person 的内部类
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME]; // 默认值为 PhoneType.HOME
}
repeated PhoneNumber phones = 4;
}
// AddressBookProtos 的内部类
message AddressBook {
repeated Person people = 1;
}
部分关键字解析:
- syntax:规定使用的版本,有 proto2 和 proto3 两个选项
- option:可选选项,对应的数据不一定要赋值
- required:必填选项,一定要赋值,不赋值的话解析数据时貌似会报错,该关键字官方不推荐使用
- repeated:重复的意思,可以理解为数组,在生成的 Java 代码中体现为 list
- message:相当于 Java 的 class,可以抽象理解为一个结构体
- 上面的 = 0、 = 1 这些是对应的属性顺序标志,用于标志编译生成代码的属性顺序,和具体业务逻辑无关
好了,编辑完上面的文件后就可以使用 Protobuf 编译器 编译了,命令如下:
protoc -I= S R C D I R − − j a v a o u t = SRC_DIR --java_out= SRCDIR−−javaout=DST_DIR $SRC_DIR/addressbook.proto
$SRC_DIR:addressbook.proto 文件所在目录
$DST_DIR:生成的代码目标输出目录
例如:
protoc -I=C:UserswongtDesktop --java_out=C:UserswongtDesktop C:UserswongtDesktopAddressBookProtos.proto
生成的代码就不贴上来啦,非常长~,值得注意的是对象是通过 builder 的方式来创建和赋值的,例如:
Person person = AddressBookProtos.Person.newBuilder()
.setName("小明")
.setId(1)
.setEmail("1@qq.com")
.build();
最后就是把上面实例化之后的 person 通过 socket 等网络编程方式或者其他方式进行数据的传输了
最后
以上就是无语白羊为你收集整理的Protobuf 基本使用的全部内容,希望文章能够帮你解决Protobuf 基本使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复