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

旅游兼职网站建设wordpress多站用户

旅游兼职网站建设,wordpress多站用户,wordpress 代码,wordpress地图插件Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML#xff0c;这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同#xff1a;一个是数据结构化#xff0c;一个是数据序列化。这里的数据结构化…Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同一个是数据结构化一个是数据序列化。这里的数据结构化主要面向开发或业务层面数据序列化面向通信或存储层面当然数据序列化也需要“结构”和“格式”所以这两者之间的区别主要在于面向领域和场景不同一般要求和侧重点也会有所不同。数据结构化侧重人类可读性甚至有时会强调语义表达能力而数据序列化侧重效率和压缩。JSON、XML 同样也可以直接被用来数据序列化实际上很多时候它们也是这么被使用的例如直接采用 JSON、XML 进行网络通信传输此时 JSON、XML 就成了一种序列化格式它发挥了数据序列化的能力。但是经常这么被使用不代表这么做就是合理。实际将 JSON、XML 直接作用数据序列化通常并不是最优选择因为它们在速度、效率、空间上并不是最优。换句话说它们更适合数据结构化而非数据序列化。扯完 XML 和 JSON我们来看看 ProtoBuf同样的 ProtoBuf 也具有数据结构化的能力其实也就是上面介绍的 message 定义。我们能够在 .proto 文件中通过 message、import、内嵌 message 等语法来实现数据结构化但是很容易能够看出ProtoBuf 在数据结构化方面和 XML、JSON 相差较大人类可读性较差不适合上面提到的 XML、JSON 的一些应用场景。但是如果从数据序列化的角度你会发现 ProtoBuf 有着明显的优势效率、速度、空间几乎全面占优看完后面的 ProtoBuf 编码的文章你更会了解 ProtoBuf 是如何极尽所能的压榨每一寸空间和性能而其中的编码原理正是 ProtoBuf 的关键所在message 的表达能力并不是 ProtoBuf 最关键的重点。所以可以看出ProtoBuf重点侧重于数据序列化而非数据结构化。最终对这些个人思考做一些小小的总结XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力XML、JSON 更注重数据结构化关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化关注效率、空间、速度人类可读性差语义表达能力不足(为保证极致的效率会舍弃一部分元信息)ProtoBuf 的应用场景更为明确XML、JSON 的应用场景更为丰富。我们先来看看官方文档给出的定义和描述protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法它可用于(数据)通信协议、数据存储等。Protocol Buffers 是一种灵活高效自动化机制的结构数据序列化方法可类比 XML但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。你可以定义数据的结构然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构而不破坏由旧数据结构编译的已部署程序。简单来讲 ProtoBuf 是结构数据序列化[1] 方法可简单类比于 XML[2]其具有以下特点语言无关、平台无关。即 ProtoBuf 支持 Java、C、Python 等多种语言支持多个平台高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单扩展性、兼容性好。你可以更新数据结构而不影响和破坏原有的旧程序protobuf3的变化默认值protobuf3 删除了 protobuf2 中用来设置默认值的 default 关键字取而代之的是protobuf3为各类型定义的默认值也就是约定的默认值如下表所示类型默认值boolfalse整形0string空字符串 enum第一个枚举元素的值因为Protobuf3强制要求第一个枚举元素的值必须是0所以枚举的默认值就是0message不是null而是DEFAULT_INSTANCE可以看出来protobuf3定义的默认值跟Java中类的属性的默认值规则并不一样Java中如果类的属性类型是类则该属性默认值是null而protobuf3中string、message的默认值都不是null。枚举类型不支持一个proto文件中多个枚举中定义相同的枚举常量名如下的两个枚举定义在同一个proto文件中enum Enum1 {IDLE 0;RUNNING 1;}enum Enum2 {IDLE 5;RUNNING 6;}编译时会报出错误IDLE is already defined in xxx出现这一错误的原因就是Protobuf3中不允许同一proto中多个枚举中使用相同的枚举值。枚举第一个常量的值必须是0message类型Java中message类型的默认值是DEFAULT_INSTANCE其值相当于空的message即XXX.newBuilder().build()这样对message类型的判空操作就应该是这样:// protobuf messagemessage User {int32 id 1;string name 2;string email 3;Address address 4;}message Address {string street 1;string building 2;}// Javaif (user.getAddress() ! null user.getAddress() ! UserProto.Address.getDefaultInstance()) {...} else {...}Protobuf数据类型基础类型proto type描述java typedouble双精度doublefloat单精度floatint3232位整数可变长度编码负数效率低编码负数推荐使用sint32intint6464位整数可变长度编码负数效率低编码负数推荐使用sint64longuint3232位无符号整数存储正数时与int32一致用的较少一般用int32长度可变intuint6464位无符号整数存储正数与int64一致用的较少一般用int64长度可变longsint32有符号32位长度可变编码负数效率高intsint64有符号64位长度可变编码负数效率高存储正数时不推荐使用longfixed32固定4个字节的长度比uint32更有效率存储正数时不推荐使用intfixed64固定8个字节的长度比uint64更有效率longsfixed32有符号整数固定4个字节intsfixed64有符号整数固定8个字节longbool布尔值booleanstring字符串Stringbytes字节数组ByteString枚举类型枚举类型中必须包含至少一个元素并且元素的编号必须从0开始。因为如果没有设置值的话可以使用0作为默认值。定义消息体syntax proto3;option java_package com.ray.protobufdemo;option java_outer_classname StudentProto3;message Student {string username 1;string password 2;string email 3;sint32 age 4;int64 timeSpane 5;double value 6;Address address 7;enum Gender {MALE 0;FEMALE 1;}Gender gender 8;}message Address {string province 1;string city 2;// 相当于java中的Listrepeated string area 3;}测试demoStudentProto3.Student studentProto StudentProto3.Student.newBuilder().setUsername(admin).setPassword(123456).setEmail(3306qq.com).setValue(Double.MAX_VALUE)// .setAge(Integer.MAX_VALUE).setAge(-2).setTimeSpane(System.currentTimeMillis()).setAddress(address).setGender(StudentProto3.Student.Gender.MALE).build();嵌套消息类型Student.protosyntax proto3;option java_package com.ray.protobufdemo;option java_outer_classname StudentProto3;message Student {string username 1;string password 2;string email 3;sint32 age 4;int64 timeSpane 5;double value 6;Address address 7;}message Address {string province 1;string city 2;// 相当于java中的Listrepeated string area 3;}StudentPtoto3Demo.java// 使用protobuf3序列化StudentProto3.Address address StudentProto3.Address.newBuilder().setProvince(北京).setCity(北京).addArea(chaoyang).addArea(miyun).build();StudentProto3.Student studentProto StudentProto3.Student.newBuilder().setUsername(admin).setPassword(123456).setEmail(3306qq.com).setValue(Double.MAX_VALUE)// .setAge(Integer.MAX_VALUE).setAge(-2).setTimeSpane(System.currentTimeMillis()).setAddress(address).build();System.out.println(studentProto);System.out.println(studentProto.toByteArray().length);repeated类型repeated相当于java中的List类型在其内部定义的类型可以是任意的。reserved类型当定义文件中的一些字段需要移除最好不要直接删除而是使用reserved标记要删除的字段如果有人使用了被标记删除的字段编译器会报错。有两种标记删除方式根据字段顺序标记message Demo {reserved 2, 5, 9 to 11 // 字段顺序为2、5以及9到11的标记为删除}根据字段名称标记message Demo {reserved name, age // 字段名称为name和age的被标记为删除}Map类型在ProtoBuf中可以定义Map类型语法如下map map_field N;key_type可以是其他的Message类型string类型PB类型定义表中(scalar value type)除了浮点类型和byte字节类型以外的其他类型。需要注意以下几点枚举类型不能够作为key_typevalue_type可以是除了Map以外的其他任何类型map不能定义为repeated类型map不保证顺序定义proto文件syntax proto3;option java_package com.ray.protobufdemo;option java_outer_classname MapProto3;message MapPerson {map projects 1;}message Project {string name 1;int32 age 2;}测试demopublic class MapProtoDemo {public static void main(String[] args) {MapProto3.Project p1 MapProto3.Project.newBuilder().setName(neo).setAge(22).build();MapProto3.Project p2 MapProto3.Project.newBuilder().setName(mary).setAge(33).build();MapProto3.MapPerson student MapProto3.MapPerson.newBuilder().putProjects(student, p1).putProjects(teacher, p2).build();System.out.println(student);}}oneof类型oneof关键字内部可以定义多个field在使用的时候只能设置一个值。定义消息体syntax proto3;option java_package com.ray.protobufdemo;option java_outer_classname OneOfProto3;message Test1 {string name 1;int32 age 2;oneof test_oneof {Request req 3;Response rep 4;}}message Request {string req 1;}message Response {string rep 1;}测试demopublic class OneOfProtoDemo {public static void main(String[] args) throws InvalidProtocolBufferException, Descriptors.DescriptorValidationException {OneOfProto3.Request request OneOfProto3.Request.newBuilder().setReq(request).build();OneOfProto3.Response response OneOfProto3.Response.newBuilder().setRsp(response).build();OneOfProto3.Test1 neo OneOfProto3.Test1.newBuilder().setName(neo).setAge(22)// rep和rsp只能设置其中的一个// .setReq(request).setRsp(response).build();System.out.println(neo);OneOfProto3.Test1 test1 OneOfProto3.Test1.parseFrom(neo.toByteArray());}}package包定义Package包定义可以防止Message重名问题类似于java中的包。在java中使用Protobuf的包有以下两种方式使用package关键字定义protobuf的模板消息包名这种方式可以在多个语言中使用syntax proto3;package bar.foo;option java_outer_classname OneOfProto3;message PackageProto {string name 1;int32 age 2;}我们在使用的时候需要如下做package com.ray.protobufdemo.entity;// 导入package处声明的包import bar.foo.OneOfProto3;public class PackageProtoDemo {public static void main(String[] args) {OneOfProto3.PackageProto.Builder builder OneOfProto3.PackageProto.newBuilder();}}使用option java_package语句声明java的包名该用法是java独有的如果不定义则使用package中的包路径option java_package com.ray.protobufdemo;import语法在Protobuf中不同的消息可以分别写在不同的proto文件中在使用的时候可以使用关键字import引用其他消息模板。protobuf的使用定义消息的格式// 声明使用proto3协议如果不指定则默认使用proto2协议syntax proto3;option java_package com.ray.protobufdemo;option java_outer_classname AddressBook;message Person {string name 1;int32 id 2;string email 3;enum PhoneType {// 在proto3中第一个枚举值的序号必须为0MOBILE 0;HOME 1;WORK 2;}message PhoneNumber {string number 1;PhoneType type 2;}repeated PhoneNumber phone 4;}message AddressBook {// 在AddressBook message中引用另一个message Personrepeated Person person 1;}protobuf消息格式说明Person消息定义指定了三个字段(名称/值对)每一个字段对应于要包含在这种类型的消息中的数据。每个字段都有一个名称和一个类型以及一个序号。指定字段类型在上例中所有字段都是标量类型:两个整数(page_number和result_per_page)和一个字符串(query)。但是您也可以为字段指定复合类型包括枚举和其他消息类型。分配字段编号如您所见消息定义中的每个字段都有一个唯一的编号。这些字段编号用于以二进制格式标识您的字段一旦您的消息类型被使用就不应该被更改。请注意1到15范围内的字段编号需要一个字节来编码包括字段编号和字段类型(您可以在协议缓冲区编码中找到更多信息)。16到2047范围内的字段编号需要两个字节。因此您应该为经常出现的消息元素保留数字1到15。记住为将来可能添加的频繁出现的元素留出一些空间。那protobuf是怎么做到向前及向后兼容的呢靠的就是这个字段的编号在反序列化的时候protobuf会从输入流中读取出字段编号然后再设置message中对应的值。如果读出来的字段编号是message中没有的就直接忽略如果message中有字段编号是输入流中没有的则该字段不会被设置。所以即使通信的两端存在一方比另一方多出编号也不会影响反序列化。但是如果两端同一编号的字段规则或者字段类型不一样那就肯定会影响反序列化了。所以一般调整proto文件的时候尽量选择加字段或者删字段而不是修改字段编号或者字段类型。您可以指定的最小字段编号为1最大字段编号为229 - 1即536870911。但是不能使用数字19000到19999 ( FieldDescriptor::kFirstReservedNumber 到FieldDescriptor::kLastReservedNumber)因为它们是为协议缓冲区实现而保留的-如果您在 .proto文件中使用这些保留的数字之一协议缓冲区编译器就会报错。同样您也不能使用任何保留字段。指定字段规则消息字段可以是以下字段之一:singular: 可以有零个或其中一个字段(但不超过一个)。repeated: 该字段可以重复任意次数(包括零次)。重复值的顺序将保留在Protocol Buffer中将重复字段视为动态大小的数组。protobuf处理这个字段的时候另外加了一个count计数变量用于标明这个字段有多少个这样发送方发送的时候同时发送了count计数变量和这个字段的起始地址接收方在接受到数据之后按照count来解析对应的数据即可。在java中使用protobuf3安装idea插件添加pom依赖com.google.protobufprotobuf-java3.4.0kr.motd.mavenos-maven-plugin1.6.2org.xolstice.maven.pluginsprotobuf-maven-plugin0.5.0${project.basedir}/src/main/protobufcom.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}compile定义message// user.proto// 定义protobufsyntax proto3;option java_package com.ray.bigdata.protobuf;// 指定生成的java类名option java_outer_classname DemoModel;message User {int32 id 1;string name 2;string sex 3;}测试demopackage com.ray.bigdata.canal;import com.google.protobuf.InvalidProtocolBufferException;import com.ray.bigdata.protobuf.DemoModel;/*** 使用protobuf进行数据的序列化和反序列化*/public class ProtobufDemo {public static void main(String[] args) throws InvalidProtocolBufferException {// 实例化protobuf对象DemoModel.User.Builder builder DemoModel.User.newBuilder();// 给user对象进行赋值builder.setId(1);builder.setName(张三);builder.setSex(男);// 获取user对象的属性值DemoModel.User userBuilder builder.build();System.out.println(userBuilder.getId());System.out.println(userBuilder.getName());System.out.println(userBuilder.getSex());/*** 数据的序列化和反序列化* 序列化可以将对象转换成字节码数据存储到kafka中* 反序列化可以将kafka中的数据消费出来转换为java对象使用*/// 将一个对象序列化成二进制的字节码数据存储到kafka中byte[] bytes builder.build().toByteArray();for (byte b: bytes) {System.out.println(b);}// 将kafka中消费的数据反序列化DemoModel.User user DemoModel.User.parseFrom(bytes);System.out.println(user);System.out.println(user.getName());System.out.println(user.getSex());}}
http://www.pierceye.com/news/711577/

相关文章:

  • 天津市建设工程合同备案网站网站建设 开发 模板
  • 外贸网站建设公司报价jsp网站建设技术案例
  • 旅行社英文模板网站织梦 网站迁移
  • 北京网站开发不限年龄伊春建设银行网站
  • 通辽公司做网站网站常规seo优化步骤
  • 成都集团网站设计推荐夫唯seo系统培训
  • 服务器有了网站怎么做的零食进货渠道网
  • 网站建设的学习方法桔子建站
  • 公司网站开通长沙免费网站建站模板
  • 汕头手机建站模板建设工程合同司法解释一
  • 品牌网站建设基本流程中山外发加工网
  • 网站迁移教材xyz域名的网站有哪些
  • 茂名公司网站开发tp框架做视频网站
  • 专门做家教的网站优秀网站设计赏析
  • 美食网站的建设背景婚庆网站建设
  • 榆社网站建设销售新品牌如何推广
  • 网站制作的公司哪家比较好网页作图软件
  • 网站开发质保动态wordpress动态主题
  • 建公司网站设计网站公司百度后台登录
  • 响应式网站开发方法建设汽车行业网站
  • 51ppt模板免费下载网站浏览器下载大全免费下载
  • 阳西县建设局网站.net网站项目有哪些
  • 门户网站优化网站建立软件
  • 贵阳网站建设在哪里陕西省住房城乡建设部门户网站
  • 深圳网站建设799元起全包域名企业网站分为哪四类
  • 潍坊网站建设公司商城网站建设建站系统
  • 苏州区网站建设网站前台乱码
  • 网站设计公司企业邮箱青岛网站制作工具
  • 网站建设 html5wordpress 关注公众号
  • 自建公司网站利用网站文件下载做推广