一、安裝
我在win10端下載的是 protoc-3.11.4-win64.zip,根據平臺不同按需下載。
下載地址
二、IDEA安裝Protobuf插件
三、編寫 proto 文件
數據類型對應不同語言的如下:
syntax = "proto3"; // PB協議版本
import "google/protobuf/any.proto"; // 引用外部的message,可以是本地的,也可以是此處比較特殊的 Any
package jet.protobuf; // 包名,其他 proto 在引用此 proto 的時候,就可以使用 test.protobuf.PersonTest 來使用,
// 注意:和下面的 java_package 是兩種易混淆概念,同時定義的時候,java_package 具有較高的優先級
option java_package = "com.haya.rabbitmq.message"; // 生成類的包名,注意:會在指定路徑下按照該包名的定義來生成文件夾
option java_outer_classname="ProtoMessage"; // 生成類的類名,注意:下劃線的命名會在編譯的時候被自動改爲駝峯命名
message PersonTest {
int32 id = 1; // int 類型
string name = 2; // string 類型
string email = 3;
Sex sex = 4; // 枚舉類型
repeated PhoneNumber phone = 5; // 引用下面定義的 PhoneNumber 類型的 message
map<string, string> tags = 6; // map 類型
repeated google.protobuf.Any details = 7; // 使用 google 的 any 類型
// 定義一個枚舉
enum Sex {
DEFAULT = 0;
MALE = 1;
Female = 2;
}
// 定義一個 message
message PhoneNumber {
string number = 1;
PhoneType type = 2;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
}
}
四、編譯成Java類
protoc --java_out=./ ./demo.proto
五、使用生成的Java類
demo.proto文件編譯後生成ProtoMessage.java,而在demo.proto文件中定義的PersonTest 則是ProtoMessage靜態類。
5.1、創建對象
ProtoMessage的空參數構造方法是private的,所以無法直接new出來。這裏ProtoMessage實現了構造器模式去實例化PersonTest對象。
ProtoMessage.PersonTest person= ProtoMessage.PersonTest.newBuilder().setName( "名字" ).build();
5.2、對象轉化爲byte[]
byte[] buf = person.toByteArray();
5.3、byte[]轉對象
ProtoMessage.PersonTest person = ProtoMessage.PersonTest.parseFrom(buf);
六、其它
參考:Protobuf 使用指南
Json與Protobuf性能對比: 點我