当前位置: 首页 > 科技观察

Protobuf序列化这么强,花五分钟学习一下如何?_0

时间:2023-03-13 04:28:12 科技观察

java内置的序列化机制效率太低,缺点也很多。因此,很多优秀的序列化框架应运而生,protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等。本篇文章,我们先来了解一下protobuf,举个简单的案例,看看它是如何实现的实施。注:如果对序列化概念和基本用法还有疑问,可以看我之前的文章,或者百度一些基本概念和功能。1、为什么要用protobuf?之所以使用protobuf,肯定是为了解决开发中的一些问题。使用其他序列化机制会出现什么问题?(1)Java默认的序列化机制:效率极低,而且数据也无法跨语言共享。(2)XML常用于数据传输或与其他项目共享数据,但编码和解码会造成较大的性能损失。(3)json格式也是常见的,但是在解析json的时候非常耗时,json结构占用内存也很大。但是我们的protobuf是一种灵活、高效、自动化的序列化机制,可以有效解决上述问题。二、如何使用protobufprotobuf非常优秀,使用起来也非常简单。我们可以给出它的三个主要步骤,然后用一个基本的案例来实现。(1)定义.proto文件:我们在这个文件中描述我们序列化后的信息,类似于bean类。(2)根据.proto生成对应的class文件。上面的原型就像一个模板。现在我们需要基于这个模板创建一个java类。(3)序列化。有了这个基本步骤,下面我们来详细实现一下:1.下载安装protobuf第一步:下载解压我的电脑是windows10,所以这里介绍windows下的使用,后续文章roll会在linux下使用出去。我们先下载protobuf(在github上搜索protobuf,有各种语言可以选择)。选择protoc-3.9.0-win64.zip。下载完成后,解压到D:/protobuf目录下。第二步:配置环境变量就是将D:\protobuf\protoc-3.9.0-win64\bin配置到path环境变量中。第三步:验证是否安装成功最后我们可以在cmd中输入protoc--version来验证是否安装成功。OK,到这里我们就安装好了。2、在写proto文件之前,我们说过proto文件和javabean很相似。在这里,我们在bin目录中创建一个新的Person.proto文件(和proto.exe)。输入以下内容:syntax="proto3";optionjava_package="com.fdd.protobuf";optionjava_outer_classname="PersonProto";messagePerson{stringname=1;int32age=2;}我们先解释一下我们写的(1)的一些内容line有一个proto3,代表protobuf的语法版本,类似于jdk1.7和jdk1.8的概念。需要在第一行指定。默认为proto2。(2)java_package:表示java包,不指定则使用包。生成的类将放在包下。这里的意思是将生成的类存放在com.fdd.protobuf包下。(3)java_outer_classname:我们说过.proto文件需要生成对应的类。此参数指定要输出的类名。这里表示生成的类名为PersonProto。(4)message用于数据格式定义。可以在.proto文件中定义多个消息字段。message中定义的字段支持string、byte、bool、map、enum、numeric类型和后面需要指定的自定义消息定义字段唯一标识号,这些数字用于标识二进制格式message中的字段,一次你开始使用这个消息,那么标识号是不能改变的如果你需要定义一个List,只需要在字段前添加repeated。如果你已经使用了这个消息生成类之后,如果你想添加一个字段,直接添加就可以了。新字段的类在解析旧数据时,会将新字段设置为默认值。当旧类解析新数据时,新字段将被忽略。例如这里我们定义了一个复杂的proto文件:syntax="proto3";optionjava_package="com.fdd.protobuf";optionjava_outer_classname="Persons";messageStaff{int32id=1;stringname=2;int32age=3;//pieces例子enumPhoneType{MOBILE=0;TELEPHONE=1;}//嵌套示例messagePhoneNumber{stringnumber=1;PhoneTypetype=2;}//列表示例repeatedPhoneNumberphone=4;messageMap{stringkey=1;int32value=2;}//地图示例Mapmap=5;}由于这只是一个基本情况,你可以根据自己的需要定义其他数据类型。3、根据proto文件生成class文件,编译非常简单。我们下载的protobuf下有一个bin目录,里面有一个proto.exe。我们只是用它来编译person.proto文件。即执行proto.exe--java_out=/Person.proto即可编译成功。4.使用上面的class类文件意味着我们已经做好了序列化的准备工作,接下来就可以直接使用这个类了。(1)第一步:将生成的PersonProto类引入到我们的IDEA或者eclipse中。(2)第二步:在idea或eclipse中添加protobuf依赖。com.google.protobufprotobuf-java3.9.0(三)第三步:使用先看一些如何序列化://1。创建BuilderPersonProto.Person.Builderbuilder=PersonProto.Person.newBuilder();//2.设置Person的属性builder.setAge(20);builder.setName("java架构师技术栈");//3.创建PersonPersonProto.Personperson=builder.build();//4.序列化byte[]data=person.toByteArray();//5.将数据保存到本地或者传到网络返回Serializationtry{//一行代码实现反序列化,数据可以是本地数据也可以是网络数据PersonProto.Personperson=PersonProto.Person.parseFrom(data);System.out.println(person.getAge());系统。out.println(person.getName());}catch(InvalidProtocolBufferExceptione){e.printStackTrace();}OK,这就是基本的使用流程。总结基本上我们定义proto文件,然后使用proto.exe编译成class文件,最后导入这个类和依赖就可以直接使用了。当然,这只是最简单的代码,本教程也算是一个简单的教程。本文转载自微信公众号《愚公要移山》,作者冯冬冬。转载本文请联系愚公移山公众号。