公司做网站价格,杯子网站开发方案模板,世界十大市场调研公司,全网媒体发布平台我们之前曾讲过java自带的一种序列化机制#xff0c;但是这种机制效率太低#xff0c;有很多缺点。因此也涌现出了很多优秀的系列化框架#xff0c;比如说protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等等。这篇文章我们就看一下第一个序列化框架proto…我们之前曾讲过java自带的一种序列化机制但是这种机制效率太低有很多缺点。因此也涌现出了很多优秀的系列化框架比如说protobuf、protostuff、thrift、hession、kryo、avro、fst、msgpack等等。这篇文章我们就看一下第一个序列化框架protobuf给出一个简单案例看看其是如何实现的。注若你对序列化概念和基本使用还有疑惑可以翻看我之前的文章或者百度一些基本概念和作用。一、为什么要使用protobuf使用protobuf的原因肯定是为了解决开发中的一些问题那使用其他的序列化机制会出现什么问题呢(1)java默认序列化机制效率极低而且还能不能跨语言之间共享数据。(2)XML常用于与其他项目之间数据传输或者是共享数据但是编码和解码会造成很大的性能损失。(3)json格式也是常见的一种但是在json在解析的时候非常耗时而且json结构非常占内存。但是我们protobuf是一种灵活的、高效的、自动化的序列化机制可以有效的解决上面的问题。现在应该清楚了吧正是由于目前的机制存在了很多问题所以才有了这个序列化框架。二、如何使用protobufprotobuf这么优秀使用起来也是非常的简单我们可以给出其主要的三个步骤然后使用一个基本的案例去实现一下。(1)定义.proto文件我们在这个文件中描述我们序列化的信息类似于bean类。(2)根据.proto生成对应的类文件上面这个proto就像是一个模板现在我们要根据这个模板创建出一个java类。(3)序列化。有了这个基本的步骤我们我们就具体去实现一下1、下载安装protobuf第一步下载解压我的电脑是windows10因此这里给出在windows下的使用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 文件非常类似java的bean。在这里我们在bin目录下新建一个Person.proto文件(和proto.exe)。输入下列内容syntaxproto3;option java_package com.fdd.protobuf;option java_outer_classname PersonProto;message Person {string name 1;int32 age 2;}我们解释一些我们都写了什么(1)第一行有一个proto3他表示的是protobuf的语法版本就类似于jdk1.7和jdk1.8的概念。需要在第一行指定。默认使用的是proto2。(2)java_package表示的是java包不指定就使用 package.生成的类会放到该package下。这里表示把生成的类存放在com.fdd.protobuf包下面。(3)java_outer_classname我们说过.proto文件要生成对应的类这个参数就指定输出什么类名。这里表示生成的类名是PersonProto。(4)message 是用于数据格式定义.一个 .proto 文件中可以定义多个 messagemessage 中定义的字段支持 string、byte、bool、map、enum、数字类型和用户自定义的 message定义字段后面需要指定唯一的标识数字,这些数字用于识别二进制格式 message 中的字段,一旦开始使用这个 message,那么标识数字就不能改变如果需要定义 List,则在字段前加repeated即可.如果已经使用过该 message 生成的类后,想要增加字段直接新增即可.当新增字段的类解析老数据时,会将新字段置为默认值.当旧的类解析新数据时会忽视掉新增字段.比如说这里我们就定义一个复杂的proto文件syntax proto3;option java_package com.fdd.protobuf;option java_outer_classname Persons;message Staff {int32 id 1;string name 2;int32 age 3;// 枚举示例 enum PhoneType {MOBILE 0;TELEPHONE 1;}// 嵌套示例 message PhoneNumber {string number 1;PhoneType type 2;}// list示例 repeated PhoneNumber phone 4;message Map {string key 1;int32 value 2;}// map示例 Map map 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(3)第三步使用首先看一些如何序列化//1、 创建BuilderPersonProto.Person.Builder builder PersonProto.Person.newBuilder();//2、 设置Person的属性builder.setAge(20);builder.setName(java的架构师技术栈);//3、 创建PersonPersonProto.Person person builder.build();//4、序列化byte[] data person.toByteArray();//5、将data保存在本地或者是传到网络然后反序列化try {//一行代码实现反序列化data可以是本地数据或者是网络数据 PersonProto.Person person PersonProto.Person.parseFrom(data);System.out.println(person.getAge());System.out.println(person.getName());} catch (InvalidProtocolBufferException e) {e.printStackTrace();}简单吧基本上就是我们定义好proto文件然后使用proto.exe编译成类文件最后导入这个类和依赖就可以直接使用了。当然这只是一个最简单不过的代码,可以把这篇教程当成一个简单的使用教程。一般情况是是结合SpringBoot来使用的。具体使用会陆续推出。