前言
主要是Netty 会用到这个进行编解码。 故学一波
Protobuf文件的生成
环境搭建
链接:下载相关资源点这里
提取码:yfo4
生成环境
首先下载D:\protobuf\protoc-3.11.4-win64 然后配置到环境变量中Path
代码环境
为了防止 代码中报红 需要加入jar包。
方便查看 安装插件 protobuf support
生成步骤
1,编写.proto 文件
syntax = "proto3";// proto3 必须加此注解
option java_package = "com.company.ser.protobuf"; // 生成类的包名,注意:会在指定路径下按照该包名的定义来生成文件夹
option java_outer_classname="SubscribeReqProto"; // 生成类的类名,注意:下划线的命名会在编译的时候被自动改为驼峰命名
message SubscribeReq{
int32 suReqID=1;
string userName=2;
string productName=3;
string address=4;
}
2,通过命令把proto转成Java文件
生成的命令,直接复制即可 cmd
cd d:\protobuf //你的位置
d:
protoc -I=./ --java_out=./ ./SubscribeReq.proto
-I:.proto 文件的位置。
--java out 输出位置会以完整包名的形式出输出
./subscribeReq.proto 需要编译成java的proto文件。
如图
使用
public class TestMainProto {
//编码
private static byte[] encode(SubscribeReqProto.SubscribeReq req) {
return req.toByteArray();
}
//解码
private static SubscribeReqProto.SubscribeReq decode(byte[] body) throws InvalidProtocolBufferException {
return SubscribeReqProto.SubscribeReq.parseFrom(body);
}
private static SubscribeReqProto.SubscribeReq createSubscribeReq() {
SubscribeReqProto.SubscribeReq.Builder builder = SubscribeReqProto.SubscribeReq.newBuilder();
builder.setSubReqID(1);
builder.setUserName("joy chen");
builder.setProductName("netty book");
List<String> address = new ArrayList<>();
address.add("NanJing");
address.add("BeiJing");
address.add("ShenZhen");
builder.addAllAddress(address);
return builder.build();
}
public static void main(String[] args) throws IOException {
SubscribeReqProto.SubscribeReq req=createSubscribeReq();
System.out.println("Before encode:" + req.toString());
SubscribeReqProto.SubscribeReq req2=decode(encode(req));
System.out.println("After 16进:" + bytesToHexFun2(encode(req)));
System.out.println("After decode:" + req.toString());
System.out.println("After equal:" + req2.equals(req));
}
private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
public static String bytesToHexFun2(byte[] bytes) {
char[] buf = new char[bytes.length * 2];
int index = 0;
for(byte b : bytes) { // 利用位运算进行转换,可以看作方法一的变种
buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
buf[index++] = HEX_CHAR[b & 0xf];
}
return new String(buf);
}
结果: