netty-protobuf 基本使用

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

发布了76 篇原创文章 · 获赞 66 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/104179499