Google ProtoBuf入門(Java)

ProtoBuf

google內部開源的一個序列化工具,高效、序列化後佔用字節小。主要用於網絡傳輸、RPC調用等,減少帶寬流量使用,提升響應速度。

Java

根據自己使用的系統,下載需要的proto工具,proto-release

Java項目需要引入proto依賴,maven:maven-proto

下面使用的的是windows系統:

  1. 首先編寫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);

    }

}

 

參考:

github-proto

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章