1.安装
brew install protobuf
2.查看安装版本
➜ 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)
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文件中增加依赖
<!-- 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));
}
}
运行结果为:
encode before:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"
after decode:subReqID: 1
userName: "Gholly"
productName: "hh"
address: "Shenzhen"
true
Process finished with exit code 0
说明编解码前后数据是一样的