一、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 monkjavaer * @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 monkjavaer * @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()); } }