netty-protobuf 基本使用
protobuf是什么
Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.
简单的来说,protobuf是一种可扩展的序列化数据结构,像xml,json一样,网络传输数据比较快
使用protobuf
优点:
- 跨语言
- 编码后体积更小,有利于存储和传输
- 编码性能高
window下安装protobuf
安装步骤:
- 下载地址https://github.com/protocolbuffers/protobuf/releases
- 选择并下载:
protoc-3.11.3-win64.zip
,然后解压到某个目录 - 加入环境变量,在解压目录到找到
protoc.exe
所有的目录,我这里是protobuf/bin
,将这个路径加入到环境变量中
- 校验安装是否成功
打开cmd,输入protoc --version
,如:
$ protoc --version
libprotoc 3.11.3
这样表示安装成功
小试持刀
在maven工程下的src/main/resources
下新建文件SubscribeReq.proto
:
syntax="proto3";
option java_package="com.chap8.protobuf.pbuf";
option java_outer_classname="SubscribeReqProto";
message SubscribeReq {
int32 subReqID=1;
string userName=2;
string productName=3;
string phoneNumber=4;
string address=5;
}
然后在控制台下输入$ protoc --java_out=../java/ SubscribeReq.proto
:
# 语法: protoc --java_out=文件输出目录 定义的.proto文件
$ protoc --java_out=../java/ SubscribeReq.proto
如果没有问题的话,可以在com.chap8.protobuf.pbuf
看到SubscribeReqProto.java
文件
测试
public class TestSubscribeRespProtoTest {
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("netty");
builder.setProductName("netty definitive guide");
List<String> addresses = new ArrayList<>();
addresses.add("ShangHai");
addresses.add("BeiJing");
builder.addAllAddress(addresses);
return builder.build();
}
public static void main(String[] args) throws InvalidProtocolBufferException {
SubscribeReqProto.SubscribeReq req = createSubscribeReq();
System.out.println("req before encode: " + req.toString());
SubscribeReqProto.SubscribeReq req1 = decode(encode(req));
System.out.println("req after decode: "+ req.toString());
System.out.println("req1: "+ req1.toString());
System.out.println("req1 assert equals req: --> "+ req1.equals(req));
}
}
}
测试结果
req before encode: subReqID: 1
userName: "netty"
productName: "netty definitive guide"
address: "ShangHai"
address: "BeiJing"
req after decode: subReqID: 1
userName: "netty"
productName: "netty definitive guide"
address: "ShangHai"
address: "BeiJing"
req1: subReqID: 1
userName: "netty"
productName: "netty definitive guide"
address: "ShangHai"
address: "BeiJing"
req1 assert equals req: --> true