Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。
一、开发前的准备
下载protoful :https://github.com/google/protobuf/releases,下载需要的版本
二、创建.proto文件
option java_package = "io.netty.example.codec" option java_outer_classname = "PersonProtobuf" message Person { required string name = 1; required int32 id =2; option 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 phone = 4; message CountryInfo { required string name = 1; required string code = 2; optional int32 number = 3; } }
三、使用protoc.exe生成java类
解压该下载的protoc-2.6.0-win32.zip,得到protoc.exe,把文件msg.proto拷贝到当前目录执行
protoc.exe --java_out=./ msg.proto
在目录下就会产生java类
四、protobuf的语法
proto文件中的数据类型可以分为两大类:复合数据类型和标准数据类型,复合数据类型包括枚举和message类型;标准数据类型包含:整形、浮点、字符串等,后面会详细介绍。
-
message
最常用的数据格式就是message,例如CountryInfo 可以用message表示:
message CountryInfo {
required string name = 1;
required string code = 2;
optional int32 number = 3;
}
Java生成后会是这样的类
-
required
必须赋值,不能为空,否则该条message会被认为是“uninitialized”。build一个“uninitialized” message会抛出一个RuntimeException异常,解析一条“uninitialized” message会抛出一条IOException异常。除此之外,“required”字段跟“optional”字段并无差别。
-
optional
字段可以赋值,也可以不赋值。假如没有赋值的话,会被赋上默认值。
-
repeated
该字段可以重复任意次数,包括0次。重复数据的顺序将会保存在protocol buffer中,将这个字段想象成一个可以自动设置size的数组就可以了
-
Enum
enum PhoneType{
MOBILE = 0;
HOME = 1;
WORK =2;
}