1. 程式人生 > >Google Protocol Buffer 的使用(二) Google Protocol Buffer 的使用(一)

Google Protocol Buffer 的使用(二) Google Protocol Buffer 的使用(一)

一、protobuf應用場景

protobuf 在Java中的應用場景可以是序列化和反序列化,流可以通過檔案或者通過網路TCP/UDP等方式傳輸。
新建一個.proto檔案

syntax = "proto3";
option java_package = "com.test.proto";
option java_outer_classname = "RequestInfo";
message SearchRequest {
    repeated Param query_param = 1;
    int32 page_number = 2;
    int32 result_per_page = 3;
}

message Param {
    int32 age = 1;
    string name = 2;
}

二、注意事項
1、使用proto3,必須顯示申明:syntax = "proto3" ,否則使用proto2
2、生成的Java類的包可新增: option java_package = "com.test.proto";
3、生成的Java類的類名可新增:option java_outer_classname = "RequestInfo";

 

三、序列化和反序列化測試

通過idea外掛生成Java類RequestInfo.java(生成方式詳見上篇文章:Google Protocol Buffer 的使用(一)),將資料序列化到本地檔案。

1、序列化測試:

/**
 * 序列化
 * @author tangquanbin
 * @date 2019/01/05 09:27
 */
public class WriteTest {

    public static void main(String[] args) throws IOException {
        //構造的RequestInfo資訊
        RequestInfo.SearchRequest.Builder searchRequest = RequestInfo.SearchRequest.newBuilder();
        searchRequest.setPageNumber(1);
        searchRequest.setResultPerPage(10);
        RequestInfo.Param.Builder param = RequestInfo.Param.newBuilder();
        param.setAge(25);
        param.setName("Lee");
        searchRequest.addQueryParam(param);
        RequestInfo.SearchRequest request = searchRequest.build();
        //寫檔案
        FileOutputStream outputStream = new FileOutputStream(new File("F:\\request.pro"));
        request.writeTo(outputStream);
        outputStream.close();
    }
}

2、 反序列化測試:

/**
 * 反序列化
 * @author tangquanbin
 * @date 2019/01/06 09:43
 */
public class ReadTest {
    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream(new File("F:\\request.pro"));
        RequestInfo.SearchRequest request = RequestInfo.SearchRequest.parseFrom(in);
        System.out.println(request.toString());
    }
}