本来是正在研究学习netty,教程中出现了protobuf,索性仔细研究了一番。厚积薄发,说不定哪一天就突然要用到。
protobuf是一种类似于json和xml的数据传输格式,优势在于高效的序列化和反序列化。关于这个,我没有去测试,只是把整个使用过程熟悉了一遍。
一、首先是需要安装protobuf
我是用的是windows,需要从github下载安装文件
https://github.com/protocolbuffers/protobuf/releases
需要下载这个文件,这是目前的最新版本。
https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-win64.zip
下载之后解压,然后添加到环境变量。测试是否可用
C:\Users\chris>protoc --version
libprotoc 3.15.8
二、我们要在Idea中去编辑proto文件,需要一个对.proto格式支持的插件。到github去下载这个插件
https://github.com/ksprojects/protobuf-jetbrains-plugin/releases/download/v0.13.0/protobuf-jetbrains-plugin-0.13.0.zip
然后通过本地安装插件,重启Idea。
三、建立一个Java工程,创建.proto文件
四、生成Java类
终端默认处在工程根部,执行命令:
protoc --java_out=./src/main/java/ ./src/proto/Person.proto
自动生成的文件建议不要做修改,所以原始.proto文件中最好有package属性,否则生成Java类之后就必须要去修改包。虽然不伤大雅,但是破坏原则。
五、添加依赖
implementation 'com.google.protobuf:protobuf-java:3.15.8'
implementation 'com.google.protobuf:protobuf-java-util:3.15.8'
六、测试类
package com.chris.proto;
import com.google.protobuf.InvalidProtocolBufferException;
/**
* @author Chris Chan
* Create on 2021/4/19 20:38
* Use for:
* Explain:
*/
public class ProtoTest {
public static void main(String[] args) throws InvalidProtocolBufferException {
//构建对象
ProtobufData.Person person = ProtobufData
.Person
.newBuilder()
.setName("chris")
.setAge(44)
.setGender(ProtobufData.Person.Gender.MAN)
.setAddress("中国上海")
.setJob(ProtobufData.Person.Job.newBuilder().setCompanyName("满天星公司").setWork("Java开发"))
.build();
//序列化
byte[] byteArray = person.toByteArray();
//反序列化
ProtobufData.Person person1 = ProtobufData.Person.parseFrom(byteArray);
//测试
System.out.println(person1.getJob().getWork());
}
}
这个过程没有网络数据传输。只是测试了数据的序列化和反序列化。
七、测试结果
整个过程就这样。下一篇文章我们建立netty通信模型,通过proto来传输数据。