文章目录
protocal buffer google出品,平台无关&语言无关–
.proto
文件可以和java和c++转化
思路是先是无脑的使用一下,然后介绍不同字段是怎么编码的,然后再介绍protobuf的语法。
java版基础使用
以下会通过一个简单的示例来介绍protobuf的基本使用
- 安装protobuff编译器
- 定义
.proto
文件 - 用
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
指令编译 - 用javaAPI去读取
1、protobuf的安装
- 下载
比如mac64位
那么就下载protoc-3.11.2-osx-x86_64.zip - 查看版本
解压后进入bin目录查看
2、定义.proto
文件
syntax = "proto2";
package tutorial;
option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
字段 | 描述 |
---|---|
syntax | protobuf版本,目前已更新到proto3 |
package | 指定包名:默认包名 |
option java_package | 指定包名,实际包名。如果该字段有定义,那么就使用 java_package,没有的话就使用package作为包名,为了避免碰撞即使有该字段,也要定义package |
option java_outer_classname | 指定类名,编译后就会生成com.example.tutorial.AddressBookProtos 类,如果没有定义该字段,默认使用文件名作为class名称,比如my_proto.proto 会使用MyProto 作为文件名 |
required string name | required 表示字段为必要字段。 |
optinal | 可选,没有该属性时,会被赋成默认值:string为"",int 为0; |
repeated | 数组,编译后的对象为phones=[187***,182**,…] |
enum | 枚举类型 |
=1、=2 | 标记在每一个属性上,作为唯一的tag ,被用于二进制编码。范围是1~(2^29)-1,使用1-15 时会使用少于一个byte 标识,最常用的(后面编译会解释为什么) |
3、编译
protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
protoc --java_out=./ ./addressbook.proto
就会生成java的类文件com.example.tutorial.Address BookProtos.java
4、.proto与java格式映射
.proto
不同的字段定义会生成对应的api
// required string name = 1;
public boolean hasName();
public String getName();
// required int32 id = 2;
public boolean hasId();
public int getId();
// optional string email = 3;
public boolean hasEmail();
public String getEmail();
// repeated .tutorial.Person.PhoneNumber phones = 4; repeated生成list
public List<PhoneNumber> getPhonesList();
public int getPhonesCount();
public PhoneNumber getPhones(int index);
同时构造器Person.Builder会生成以下的方法
// required string name = 1;
public boolean hasName();
public java.lang.String getName();
public Builder setName(String value);
public Builder clearName();
// required int32 id = 2;
public boolean hasId();
public int getId();
public Builder setId(int value);
public Builder clearId();
// optional string email = 3;
public boolean hasEmail();
public String getEmail();
public Builder setEmail(String value);
public Builder clearEmail();
// repeated .tutorial.Person.PhoneNumber phones = 4;
public List<PhoneNumber