Protobuf 基本使用

Protobuf 可以做什么?

Protobuf 全称 Protocol Buffers,根据官网(请自备梯子)的介绍,是一个跨语言数据传输中间件,也就是说可以在不同语言之间通过 Protobuf 来传输数据,然后结合 netty 就能够跨设备跨系统跨语言传输数据了

基本使用流程:

  1. 根据 Protobuf 的规定编写 *.proto 文件
  2. 使用 Protobuf 编译器编译 *.proto 文件生成需要的代码格式(Java、Python 等)
  3. 上面生成的代码在 Java 看来有点像一个 Java Bean,用于存放数据的
  4. 在不同项目中引入对应的依赖,使用对应的 API 对上面生成“Java Bean”进行创建和赋值
  5. 使用 Socket 等方式传输序列化的“Java Bean”,进而在不同语言之间传输数据

另外,Protobuf 目前有2和3的版本,区别在于:

  1. 版本2支持 C++、Java、Python、Go 四中语言,版本3多了 Ruby、C#、PHP
  2. 版本2和3配置文件(*.proto 文件)的关键字稍有不同,但是语法差不多,都是挺容易懂的
  3. 其他的一些特性有待挖掘
为什么需要 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= SRCDIRjavaout=DST_DIR $SRC_DIR/addressbook.proto

$SRC_DIR:addressbook.proto 文件所在目录
$DST_DIR:生成的代码目标输出目录

例如:

protoc -I=C:\Users\wongt\Desktop --java_out=C:\Users\wongt\Desktop C:\Users\wongt\Desktop\AddressBookProtos.proto

生成的代码就不贴上来啦,非常长~,值得注意的是对象是通过 builder 的方式来创建和赋值的,例如:

Person person = AddressBookProtos.Person.newBuilder()
    .setName("小明")
    .setId(1)
    .setEmail("1@qq.com")
    .build();

最后就是把上面实例化之后的 person 通过 socket 等网络编程方式或者其他方式进行数据的传输了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值