当前位置: 首页 > news >正文

郑州大型网站开发公司网站管理服务

郑州大型网站开发公司,网站管理服务,wordpress 添加文章列表,制作天下网站Protobuf是什么 在我们日常编写代码的过程中#xff0c;经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求#xff0c;但是在我们日常架构之中#xff0c;经常会涉及后端服务器之间的通信#xff0c;通信过程中#xff0c;可能传递的对象就是一个类。…Protobuf是什么 在我们日常编写代码的过程中经常会涉及到网络传输的部分。我们通常会在网络之间传递各种各样的请求但是在我们日常架构之中经常会涉及后端服务器之间的通信通信过程中可能传递的对象就是一个类。这种情况下我们该如何在网络通信中传递类和对象的内容呢。目前市面上的方法也有很多比如Json序列化XML进行类的传递。但是一旦涉及到音视频和图片的传递之后该怎么办呢。有一种办法是把图片音视频进行序列化成二进制数据后进行一个传输。 下列类就是基于java标准库提供的ObjectOutputStream实现的一个简易实现对象序列化的代码 package com.czl.myRabbitMq.commom; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j;import java.io.*; //将一个对象进行序列化和反序列化 java中的对象都可以通过一下逻辑进行序列化 但前提是实现接口 Serializable Slf4j public class BinaryTransformTool {/*** 这样写是设置版本号的意思* 就是比如我今天定义了一个Message对象 对其进行了序列化 并存入了文件中* 要是第二天有人对Message对象进行修改 然后我如果读取该序列化数据 很大概率* 是会报错的 为了防止上述情况发生 这里定义一个版本表示 表示如果我今天定义版本一* 然后将数据序列化写入文件的时候 这个1这个数据就被保存下来了 要是有人对Message对象* 进行了修改 就手动加一 这样反序列化的时候就能防止读取旧版本数据了** 这个属性一般加在进行序列化的对象中 而不是这里!!!!!!!!!!!!!!!!*/private static final long serialVersionUID 1L;//将对象进行序列化操作SneakyThrowspublic static byte[] getBinaryData(Object data){//因为我们不知道将对象转为二进制数据后 这个数据的长度是几个字节 所以我们使用//ByteArrayOutputStream 这个对象 这个对象本质是一个可变长的 字节数组try(ByteArrayOutputStream byteArrayOutputStream new ByteArrayOutputStream()) {//java标准库中提供了将对象序列化的类 就是 ObjectOutputStream 后面构造器中传入的参数就是//序列化时将数据写入的地方 这里传入的是byteArrayOutputStream 所以写入这个对象里面//要是传入的是文件 则写入文件里面try (ObjectOutputStream outputStream new ObjectOutputStream(byteArrayOutputStream)) {outputStream.writeObject(data);}return byteArrayOutputStream.toByteArray();}}//将二进制数据转化为对象SneakyThrowspublic static Object fromData(byte[] data){Object object;try (ByteArrayInputStream byteArrayInputStream new ByteArrayInputStream(data)){try(ObjectInputStream objectInputStream new ObjectInputStream(byteArrayInputStream)){object objectInputStream.readObject();}return object;}} }但是上述代码是将一个对象和类进行序列化生成一个byte数组有很多序列化的细节是没有实现的。特别是针对某一个类和对象的某个属性单独进行序列化。所以Protobuf是一个可以快速生成将对象序列化代码的一个组件。 以下是官方对Protobuf的说明以及翻译 Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法它可⽤ 于数据通信协议、数据存储等。 Protocol Buffers 类⽐于 XML是⼀种灵活⾼效⾃动化机制的结构数据序列化⽅法但是⽐ XML 更⼩、更快、更为简单。 你可以定义数据的结构然后使⽤特殊⽣成的源代码轻松的在各种数据流中使⽤各种语⾔进⾏编写和 读取结构数据。你甚⾄可以更新数据结构⽽不破坏由旧数据结构编译的已部署程序。 Protobuf的基础使用 在maven项目中使用protobuf之前需要引入相关的依赖 下面的不是依赖是一个protobuf的插件用来快速对protobuf进行编译的。 dependenciesdependencygroupIdcom.google.protobuf/groupIdartifactIdprotobuf-java/artifactIdversion4.26.0/version/dependency/dependenciesbuildpluginsplugingroupIdorg.xolstice.maven.plugins/groupIdartifactIdprotobuf-maven-plugin/artifactIdversion0.6.1/versionconfiguration!-- 本地protoc.exe的目录--protocExecutableC:\protobuf\protobuf26.0\bin\protoc.exe/protocExecutable!-- proto文件放置的位置--protoSourceRoot${project.basedir}/src/main/java/proto/protoSourceRoot!-- 生成的java文件的目录--outputDirectory${project.basedir}/src/main/java/outputDirectory!-- 在编译的时候是否删除目标目录下的文件 默认为true 最好为false 以免误删--clearOutputDirectoryfalse/clearOutputDirectory/configuration/plugin/plugins/build 首先我们先创建一个新的maven工程然后在main/java目录下创建出一个proto目录用来存放我们的proto文件 此时我们可以进入proto文件中进行一个protobuf的代码编写了 在proto文件的首行中我们一般会指定当前proto文件使用的语法规则(要是不指定的话默认使用的是proto2) proto3是最新版本的语法在proto2的基础上进行了优化便于使用。 首行指定完语法之后第二行一般会为当前proto文件指定一个名称空间(唯一) 用来标识当前文件和其他文件不冲突  后面紧接着一般是选项 option后面带上一些参数 定义完之后就可以定义我们要生成的类的属性了他就会自动帮我们生成当前类的序列化和反序列化方法。  在下面的代码中我们定义了一个学生类 其中带有2个属性 一个是name 一个是age但是注意此时name后面跟的那个1不是name的值而是字段的一个编号且当前标号是不能重复的。 当前文件配置了三个选项具体含义全在注释中 //首行proto 希望我们为当前文件指定一个版本 syntax proto3; //表示当前proto文件的一个命名空间 避免定义的消息进行一个冲突 package start; //是否可以将编译之后的Java代码分为多个文件进行存放 true 可以 false 不行 option java_multiple_files true;//不配置这个只会生成一个文件 //想要生成的Java文件的package option java_package com.ex.test1; //编译完文件之后生成的类名 option java_outer_classname protoMy;//定义自定义的字段 //定义格式: //定义类段 字段名 字段唯一编号; 字段编号一旦被使用就不要轻易改变了 //19000 - 19999 是源码的预留号 一般不设置这个区间的号码 //1到15之间的字段一般用来标记出现非常频繁的字段为将来有可能添加的频繁出现的字段预留一些出来 //因为在序列化的过程中不仅仅要把值编译进去还需要把对应的编号也编译进去而1到15只需要一个字节即可编码了 //16-2047需要2个字节message MyTestStudent{string name 1; //这个1不是字段的值 是字段的编号。 同时这个字段的编号不能重复int32 age 2; } 写完proto文件之后我们就可以开始编译了 protoc [--proto_pathIMPORT_PATH] --java_outDST_DIR path/to/file.proto 在cmd中输入上述指令就可以编译了但是这段指令的参数一大堆是很麻烦的这里就不得不提到开始引入依赖时我们配置的快速编译插件了。 点击maven的图标 点击刷新找到出现的protobuf。就可以进行编译了  可以看到在编译结束之后出现了2个类和一个接口其中咱们在proto文件中定义的MyTestStudent就自动生成出来了 我只写了2个参数生成代码都600行所以这里我们不展示代码了 重点展示一下其中比较核心的内容。 可以看到这个类中有一个内部类build 可以看到里面封装了关于我们描述属性的get和set方法可以自己去瞅瞅太多了这里不展示了 同时还有一个build方法可以把我们构造的属性构造成一个对象并返回 所以也就以为着我们需要使用builder对象来设置我们需要类的属性并通过其中的build方法具体进行类的构造。 可以看到我们生成的类是继承了com.google.protobuf.GeneratedMessage这个对象 同时这个对象又继承了AbstractMessage这个对象 AbstractMessage又继承了AbstractMessageLite这个对象对象的序列化方法就在AbstractMessageLite中的 所以我们只需要调用我们生成类方法中的toByteArray就可以实现对象序列化了。 代码展示 下面是一段简单的使用代码 其中描述了我们对一个MyTestStudent对象进行序列化打印处序列化内容之后在进行反序列化并打印出反序列化的结果。 import com.ex.test1.MyTestStudent; import com.google.protobuf.InvalidProtocolBufferException; public class Main {public static void main(String[] args) throws InvalidProtocolBufferException {MyTestStudent myTestStudent MyTestStudent.newBuilder().setAge(18).setName(张三).build();byte[] by myTestStudent.toByteArray();System.out.println(by.toString());MyTestStudent student MyTestStudent.parseFrom(by);System.out.println(student.getName());} } 下一篇写protobuf的语法和其他使用规则
http://www.zqtcl.cn/news/828577/

相关文章:

  • 网站建设企业有哪些内容十九届六中全会
  • 如何管理手机网站首页怎么建设一个社交网站
  • 网站规则山东网站备案网站
  • 成都网站制作龙兵科技做网站原型图用什么软件
  • 鄂州网站网站建设做网站 用哪种
  • 医药公司网站建设厦门网站建设合同
  • 网站开发全程设计注册公司哪个网站
  • 广州大型网站设计公司网站总体设计怎么写
  • 福州网站制作工具搜索引擎营销的特点是什么
  • 安徽省建设干部网站新品网络推广
  • 做网站要实名吗怎样给一个公司做网站
  • 品牌官方网站建设大航母网站建设
  • 自己做音乐网站挣钱吗网站定制公司kinglink
  • 网站建设案例新闻随州程力网站建设
  • 国外网站平台龙岩天宫山缆车收费
  • 站长工具seo综合查询是什么湖北做网站
  • 青海网站建设价格建一个免费网站的流程
  • 网站备案中 解析地址asp.net企业网站框架
  • flash里鼠标可以跟随到网站上就不能跟随了蚌埠网站建设
  • 东莞茶山网站建设网络推广方案ppt
  • 不需要写代码的网站开发软件模板之家如何免费下载
  • 购物网站模板多媒体网站开发实验报告
  • 做网站上数字快速增加上海市建设部注册中心网站
  • 义乌市网站制作青岛建设银行银行招聘网站
  • 公司网站的留言板怎么做wordpress减肥网站采集规则
  • app软件下载站seo教程wordpress实现专题
  • 在哪里自己建设网站做网站后期需要什么费用
  • 宁波网站推广怎么做微信公众号如何运营与推广
  • 做网站开发语言农产品品牌建设
  • 百度一下你就知道官方网站做准考证的网站