ProtoBuf
google內部開源的一個序列化工具,高效、序列化後佔用字節小。主要用於網絡傳輸、RPC調用等,減少帶寬流量使用,提升響應速度。
Java
根據自己使用的系統,下載需要的proto工具,proto-release
Java項目需要引入proto依賴,maven:maven-proto
下面使用的的是windows系統:
- 首先編寫proto定義文件:(詳細語法參照github和官網)
//protobuf的序列化類定義文件,需使用proto生成要序列化的類對象,win: .\protoc.exe --java_out=輸出目錄 proto定義文件
//語法採用3標準,默認是2
syntax = "proto3";
//生成java類的包名,生成的java類名,不寫輸出classname默認爲文件名
option java_package = "tom.example.serialize.protobuf";
option java_outer_classname = "PersonProto";
//PersonProto的內部類 字段名等號後面的是字段屬性標識,不能重複
message Person {
//聲明內部類的屬性,及屬性類型,屬性編號:在同一個message內部是全局唯一的,不能夠重複。
string name = 1;
//無符號整型,有符號的話sint32
int32 age = 2;
bool sex = 3;
int64 birthday = 4;
string address = 5;
//required、optional、repeated標註存在着3中,在3.0之前,標註是必須的,但在3.0之後required、optional是可以不寫的
//repeated 代表是集合類型
repeated Car cars = 6;
map<string, string> other = 7;
}
message Car {
string name = 1;
string color = 2;
string engine = 3;
//車牌號,使用下劃線命名,在java類中會轉換爲駝峯命名的
string plate_number = 4;
double price = 5;
}
2. 使用proto工具生成java類,命令執行
//--java_out=輸出目錄,後面緊接着有個空格,空格後面是proto定義文件
.\protoc.exe --java_out=. .\person.proto
3. 編寫Java測試類:
package tom.example.serialize.protobuf;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* google protobuf. 需要編寫.proto文件,通過protobuf工具將proto文件解析生成java類,
* 生成的java類用於序列化傳輸和反序列化
* @author ZHUFEIFEI
*/
public class ProtobufDemo {
public static void main(String[] args) throws IOException {
PersonProto.Car c1 = PersonProto.Car.newBuilder()
.setColor("red")
.setEngine("V8")
.setName("Lamborghini")
.setPrice(1200)
.setPlateNumber("A0000")
.build();
PersonProto.Car c2 = PersonProto.Car.newBuilder()
.setColor("Black")
.setEngine("V12")
.setName("Pagani")
.setPrice(1800)
.setPlateNumber("A9999")
.build();
PersonProto.Person p = PersonProto.Person.newBuilder()
.setName("tom")
.setAge(999)
.setAddress("Moon")
.setBirthday(123)
.setSex(true)
.addCars(c1)
.addCars(c2)
.putOther("favor","InterStellar Travel")
.build();
//如果目錄不存在,需要先創建目錄
FileOutputStream fos = new FileOutputStream(new File("D:/data/proto/person"));
// p.writeTo(fos);
byte[] data = p.toByteArray();
System.out.println("proto len ==> " + data.length);
fos.write(data);
fos.flush();
fos.close();
FileInputStream fis = new FileInputStream(new File("D:/data/proto/person"));
PersonProto.Person p1 = PersonProto.Person.parseFrom(fis);
fis.close();
System.out.println("read person =>> " + p1);
}
}
參考: