Google Protocol Buffer 的使用(二) Google Protocol Buffer 的使用(一)
阿新 • • 發佈:2019-01-06
一、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()); } }