netty集成protobuf
一、准备工作,搭建环境
1、准备工作,需要在项目的根目录下新建文件夹,例如protobuf文件夹,并且在文件夹下放入编译器exe文件,如下图所示
2、安装maven依赖
<dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.6.1</version></dependency>
3、安装maven插件
<plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version> <!-- 使用最新版本 --><configuration><!--proto文件路径--><protoSourceRoot>${project.basedir}/protobuf</protoSourceRoot><!--目标路径--><outputDirectory>${project.build.sourceDirectory}</outputDirectory><!--设置是否在生成java文件之前清空outputDirectory的文件--><clearOutputDirectory>false</clearOutputDirectory><!--临时目录--><temporaryProtoFileDirectory>${project.build.directory}/protoc-temp</temporaryProtoFileDirectory><!--protoc 可执行文件路径--><protocExecutable>${project.basedir}/protobuf/protoc3.6.1.exe</protocExecutable></configuration><executions><execution><goals><!-- 编译 proto 文件生成基础消息类 --><goal>compile</goal><!-- 编译 proto 文件生成 gRPC 代码 --><goal>test-compile</goal></goals></execution></executions></plugin>
其中${project.basedir}/protobuf对应根路径下的protobuf文件夹
4、在根目录的protobuf文件夹文件夹下新建Msg.proto文件,内容如下
//版本
syntax="proto3";//包名
package com.example.netty_test.protocol;//选项,打包后POJO和构造器存储的位置,如果无此选项,则默认安装上面的package放
option java_package = "com.example.netty_test.protocol";//java外部类名
option java_outer_classname = "MsgProtos";message Msg {uint32 id=1;string content=2;
}
5、在项目src路径下可新建protocol包,用于生成.proto文件对应打包的POJO类和构造者的
6、maven idea 重新编译打包即可
二、操作ProtoBuf生成的POJO和构造器类
1、创建POJO对象
public static MsgProtos.Msg buildMsg(){MsgProtos.Msg.Builder personBuilder = MsgProtos.Msg.newBuilder();personBuilder.setId(1000);personBuilder.setContent("测试消息1234");MsgProtos.Msg message=personBuilder.build();return message;}
2、三种序列化和反序列化的方式
//方式1public static void serAndDesr1() {try {MsgProtos.Msg message=buildMsg();//序列化byte[] data=message.toByteArray();//反序列化MsgProtos.Msg inMsg=MsgProtos.Msg.parseFrom(data);}catch (Exception ex){ex.printStackTrace();}}//方式2public static void serAndDesr2(){try {MsgProtos.Msg message=buildMsg();//序列化到二进制码流ByteArrayOutputStream outputStream = new ByteArrayOutputStream();message.writeTo(outputStream);ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());//二进制码流反序列化成protoBuf对象MsgProtos.Msg inMsg=MsgProtos.Msg.parseFrom(inputStream);}catch (Exception ex){ex.printStackTrace();}}//方式3public static void serAndDesr3(){try {MsgProtos.Msg message=buildMsg();//序列化ByteArrayOutputStream outputStream = new ByteArrayOutputStream();message.writeDelimitedTo(outputStream);ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());//反序列化MsgProtos.Msg inMsg=MsgProtos.Msg.parseDelimitedFrom(inputStream);}catch (Exception ex){ex.printStackTrace();}}