1.安装java
brew install protobuf
2.查看安装版本git
➜ protobuf git:(dev) ✗ protoc --version libprotoc 3.4.0 ➜ protobuf git:(dev) ✗
3.生成Prtobuf文件数组
➜ java git:(dev) ✗ protoc --java_out=./ com/test/frame/zookeeper/protobuf/SubscribeReq.proto ➜ java git:(dev) ✗ pwd /Users/guanguan/study/frame/zookeeper/src/main/java ➜ java git:(dev) ✗
4.若是遇到如下问题测试
➜ protobuf git:(dev) ✗ sudo protoc --java_out=./ SubscribeReq.proto [libprotobuf WARNING google/protobuf/compiler/parser.cc:546] No syntax specified for the proto file: SubscribeReq.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
解决方案,将syntax ="proto2"或者syntax="proto3"放到.proto文件前面便可解决如(SubscribeReq.proto)ui
syntax = "proto2"; package com.test.frame.zookeeper.protobuf; option java_package="com.test.frame.zookeeper.protobuf"; option java_outer_classname="SubscribeReqProto"; message SubscribeReq{ required int32 subReqID=1; required string userName=2; required string productName=3; required string address=4; }
5.pom.xml文件中增长依赖google
<!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java --> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.4.0</version> </dependency>
6.测试编解码效果TestSubcribeReq.java编码
package com.test.frame.zookeeper.protobuf; import com.google.protobuf.InvalidProtocolBufferException; /** * TestSubscribeReqProto class * * @author guanhuifang * @date 2017/10/30 下午4:35 **/ public class TestSubscribeReqProto { /** * 编码encode * * 将SubscribeReq类型的转为字节数组 * @param req * @return */ private static byte[] encode(SubscribeReqProto.SubscribeReq req){ /** * 编码时经过调用SubscribeReqProto.SubscribeReq实例的toByteArray便可将SubscribeReq编码为byte数组 */ return req.toByteArray(); } /** * 解码 * 将字节数组转换为SubscribeReq类型 * @param body * @return * @throws InvalidProtocolBufferException */ private static SubscribeReqProto.SubscribeReq decode(byte[] body) throws InvalidProtocolBufferException { /** * 解码时经过调用SubscribeReqProto.SubscribeReq实例的静态方法parseForm将二进制byte数组解码为原始的对象 */ return SubscribeReqProto.SubscribeReq.parseFrom(body); } private static SubscribeReqProto.SubscribeReq createSubscribeReq(){ /** * 经过静态方法newBuilder建立Builder实例,经过Builder构建器对SubscribeReq的属性进行设置 */ SubscribeReqProto.SubscribeReq.Builder builder= SubscribeReqProto.SubscribeReq.newBuilder(); builder.setSubReqID(1); builder.setUserName("Gholly"); builder.setProductName("hh"); builder.setAddress("Shenzhen"); return builder.build(); } public static void main(String[] args) throws InvalidProtocolBufferException { SubscribeReqProto.SubscribeReq req=createSubscribeReq(); System.out.println("encode before:"+req.toString()); SubscribeReqProto.SubscribeReq req2= decode(encode(req)); System.out.println("after decode:"+req.toString()); System.out.println(req2.equals(req)); } }
运行结果为:code
encode before:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"orm
after decode:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"xml
true
Process finished with exit code 0
说明编解码先后数据是同样的