1、相比于optional,repeated主要用于表示数组字段。
2、对于Protocol Buffer而言,标签值为1到15的字段在编码时可以得到优化,既标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,而Protocol Buffer可以支持的字段数量则为2的29次方减一。有鉴于此,我们在设计消息结构时,可以尽可能考虑让repeated类型的字段标签位于1到15之间,这样便可以有效的节省编码后的字节数量。
3、 限定符(required/optional/repeated)的基本规则。
1.) 在每个消息中必须至少留有一个required类型的字段。
2). 每个消息中可以包含0个或多个optional类型的字段。
3.) repeated表示的字段可以包含0个或多个数据。
4). 如果打算在原有消息协议中添加新的字段,同时还要保证老版本的程序能够正常读取或写入,那么对于新添加的字段必须是optional或repeated。道理非常简单,老版本程序无法读取或写入新增的required限定符的字段
2、对于Protocol Buffer而言,标签值为1到15的字段在编码时可以得到优化,既标签值和类型信息仅占有一个byte,标签范围是16到2047的将占有两个bytes,而Protocol Buffer可以支持的字段数量则为2的29次方减一。有鉴于此,我们在设计消息结构时,可以尽可能考虑让repeated类型的字段标签位于1到15之间,这样便可以有效的节省编码后的字节数量。
3、 限定符(required/optional/repeated)的基本规则。
1.) 在每个消息中必须至少留有一个required类型的字段。
2). 每个消息中可以包含0个或多个optional类型的字段。
3.) repeated表示的字段可以包含0个或多个数据。
4). 如果打算在原有消息协议中添加新的字段,同时还要保证老版本的程序能够正常读取或写入,那么对于新添加的字段必须是optional或repeated。道理非常简单,老版本程序无法读取或写入新增的required限定符的字段
4、Protocol Buffer消息升级原则。
在实际的开发中会存在这样一种应用场景,既消息格式因为某些需求的变化而不得不进行必要的升级,但是有些使用原有消息格式的应用程序暂时又不能被立刻升级,这便要求我们在升级消息格式时要遵守一定的规则,从而可以保证基于新老消息格式的新老程序同时运行。规则如下:
1). 不要修改已经存在字段的标签号。
2). 任何新添加的字段必须是optional和repeated限定符,否则无法保证新老程序在互相传递消息时的消息兼容性。
3). 在原有的消息中,不能移除已经存在的required字段,optional和repeated类型的字段可以被移除,但是他们之前使用的标签号必须被保留,不能被新的字段重用。
4). int32、uint32、int64、uint64和bool等类型之间是兼容的,sint32和sint64是兼容的,string和bytes是兼容的,fixed32和sfixed32,以及fixed64和sfixed64之间是兼容的,这意味着如果想修改原有字段的类型时,为了保证兼容性,只能将其修改为与其原有类型兼容的类型,否则就将打破新老消息格式的兼容性。
5). optional和repeated限定符也是相互兼容的。
在实际的开发中会存在这样一种应用场景,既消息格式因为某些需求的变化而不得不进行必要的升级,但是有些使用原有消息格式的应用程序暂时又不能被立刻升级,这便要求我们在升级消息格式时要遵守一定的规则,从而可以保证基于新老消息格式的新老程序同时运行。规则如下:
1). 不要修改已经存在字段的标签号。
2). 任何新添加的字段必须是optional和repeated限定符,否则无法保证新老程序在互相传递消息时的消息兼容性。
3). 在原有的消息中,不能移除已经存在的required字段,optional和repeated类型的字段可以被移除,但是他们之前使用的标签号必须被保留,不能被新的字段重用。
4). int32、uint32、int64、uint64和bool等类型之间是兼容的,sint32和sint64是兼容的,string和bytes是兼容的,fixed32和sfixed32,以及fixed64和sfixed64之间是兼容的,这意味着如果想修改原有字段的类型时,为了保证兼容性,只能将其修改为与其原有类型兼容的类型,否则就将打破新老消息格式的兼容性。
5). optional和repeated限定符也是相互兼容的。
5、Options。
Protocol Buffer允许我们在.proto文件中定义一些常用的选项,这样可以指示Protocol Buffer编译器帮助我们生成更为匹配的目标语言代码。Protocol Buffer内置的选项被分为以下三个级别:
1). 文件级别,这样的选项将影响当前文件中定义的所有消息和枚举。
2). 消息级别,这样的选项仅影响某个消息及其包含的所有字段。
3). 字段级别,这样的选项仅仅响应与其相关的字段。
下面将给出一些常用的Protocol Buffer选项。
1>. option java_package = "com.companyname.projectname";
java_package是文件级别的选项,通过指定该选项可以让生成Java代码的包名为该选项值,如上例中的Java代码包名为com.companyname.projectname。与此同时,生成的Java文件也将会自动存放到指定输出目录下的com/companyname/projectname子目录中。如果没有指定该选项,Java的包名则为package关键字指定的名称。该选项对于生成C++代码毫无影响。
2>. option java_outer_classname = "LYPhoneMessage";
java_outer_classname是文件级别的选项,主要功能是显示的指定生成Java代码的外部类名称。如果没有指定该选项,Java代码的外部类名称为当前文件的文件名部分,同时还要将文件名转换为驼峰格式,如:my_project.proto,那么该文件的默认外部类名称将为MyProject。该选项对于生成C++代码毫无影响。
注:主要是因为Java中要求同一个.java文件中只能包含一个Java外部类或外部接口,而C++则不存在此限制。因此在.proto文件中定义的消息均为指定外部类的内部类,这样才能将这些消息生成到同一个Java文件中。在实际的使用中,为了避免总是输入该外部类限定符,可以将该外部类静态引入到当前Java文件中,如:import static com.company.project.LYPhoneMessage.*。
3>. option optimize_for = LITE_RUNTIME;
optimize_for是文件级别的选项,Protocol Buffer定义三种优化级别SPEED/CODE_SIZE/LITE_RUNTIME。缺省情况下是SPEED。
SPEED: 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。
CODE_SIZE: 和SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。
LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲Protocol Buffer提供的反射功能为代价的。因此我们在C++中链接Protocol Buffer库时仅需链接libprotobuf-lite,而非libprotobuf。在Java中仅需包含protobuf-java-2.4.1-lite.jar,而非protobuf-java-2.4.1.jar。
注:对于LITE_MESSAGE选项而言,其生成的代码均将继承自MessageLite,而非Message。
4>. [pack = true]: 因为历史原因,对于数值型的repeated字段,如int32、int64等,在编码时并没有得到很好的优化,然而在新近版本的Protocol Buffer中,可通过添加[pack=true]的字段选项,以通知Protocol Buffer在为该类型的消息对象编码时更加高效。如:
repeated int32 samples = 4 [packed=true]。
注:该选项仅适用于2.3.0以上的Protocol Buffer。
5>. [default = default_value]: optional类型的字段,如果在序列化时没有被设置,或者是老版本的消息中根本不存在该字段,那么在反序列化该类型的消息是,optional的字段将被赋予类型相关的缺省值,如bool被设置为false,int32被设置为0。Protocol Buffer也支持自定义的缺省值,如:
optional int32 result_per_page = 3 [default = 10]。
Protocol Buffer允许我们在.proto文件中定义一些常用的选项,这样可以指示Protocol Buffer编译器帮助我们生成更为匹配的目标语言代码。Protocol Buffer内置的选项被分为以下三个级别:
1). 文件级别,这样的选项将影响当前文件中定义的所有消息和枚举。
2). 消息级别,这样的选项仅影响某个消息及其包含的所有字段。
3). 字段级别,这样的选项仅仅响应与其相关的字段。
下面将给出一些常用的Protocol Buffer选项。
1>. option java_package = "com.companyname.projectname";
java_package是文件级别的选项,通过指定该选项可以让生成Java代码的包名为该选项值,如上例中的Java代码包名为com.companyname.projectname。与此同时,生成的Java文件也将会自动存放到指定输出目录下的com/companyname/projectname子目录中。如果没有指定该选项,Java的包名则为package关键字指定的名称。该选项对于生成C++代码毫无影响。
2>. option java_outer_classname = "LYPhoneMessage";
java_outer_classname是文件级别的选项,主要功能是显示的指定生成Java代码的外部类名称。如果没有指定该选项,Java代码的外部类名称为当前文件的文件名部分,同时还要将文件名转换为驼峰格式,如:my_project.proto,那么该文件的默认外部类名称将为MyProject。该选项对于生成C++代码毫无影响。
注:主要是因为Java中要求同一个.java文件中只能包含一个Java外部类或外部接口,而C++则不存在此限制。因此在.proto文件中定义的消息均为指定外部类的内部类,这样才能将这些消息生成到同一个Java文件中。在实际的使用中,为了避免总是输入该外部类限定符,可以将该外部类静态引入到当前Java文件中,如:import static com.company.project.LYPhoneMessage.*。
3>. option optimize_for = LITE_RUNTIME;
optimize_for是文件级别的选项,Protocol Buffer定义三种优化级别SPEED/CODE_SIZE/LITE_RUNTIME。缺省情况下是SPEED。
SPEED: 表示生成的代码运行效率高,但是由此生成的代码编译后会占用更多的空间。
CODE_SIZE: 和SPEED恰恰相反,代码运行效率较低,但是由此生成的代码编译后会占用更少的空间,通常用于资源有限的平台,如Mobile。
LITE_RUNTIME: 生成的代码执行效率高,同时生成代码编译后的所占用的空间也是非常少。这是以牺牲Protocol Buffer提供的反射功能为代价的。因此我们在C++中链接Protocol Buffer库时仅需链接libprotobuf-lite,而非libprotobuf。在Java中仅需包含protobuf-java-2.4.1-lite.jar,而非protobuf-java-2.4.1.jar。
注:对于LITE_MESSAGE选项而言,其生成的代码均将继承自MessageLite,而非Message。
4>. [pack = true]: 因为历史原因,对于数值型的repeated字段,如int32、int64等,在编码时并没有得到很好的优化,然而在新近版本的Protocol Buffer中,可通过添加[pack=true]的字段选项,以通知Protocol Buffer在为该类型的消息对象编码时更加高效。如:
repeated int32 samples = 4 [packed=true]。
注:该选项仅适用于2.3.0以上的Protocol Buffer。
5>. [default = default_value]: optional类型的字段,如果在序列化时没有被设置,或者是老版本的消息中根本不存在该字段,那么在反序列化该类型的消息是,optional的字段将被赋予类型相关的缺省值,如bool被设置为false,int32被设置为0。Protocol Buffer也支持自定义的缺省值,如:
optional int32 result_per_page = 3 [default = 10]。
源:http://www.cnblogs.com/stephen-liu74/archive/2013/01/02/2841485.html
相关推荐
在使用BUF634时,需要注意以下几点: 1. 确保电源电压在规定的范围内,过高或过低都可能导致器件损坏或性能下降。 2. 注意输入和输出的极性,避免反接导致损坏。 3. 为了减少噪声和提高稳定性,通常会在输入端添加...
Protocol Buffers是Google开发的一种数据序列化协议,用于结构化数据的序列化,可以视为一种跨平台、跨语言的数据交换格式。它允许开发者定义数据结构,然后生成代码以轻松地在各种数据流之间读写这些数据。Protocol...
buf和buf+1和buf+2中求三个数的最大值。并存放到num中
buf634中文资料 buf634芯片是一款高性能的运算放大器芯片,以下是其详细的技术信息。 目录 buf634芯片的目录结构包括产品特点、应用、描述、规格、引脚结构、绝对最大额定值、典型性能曲线、应用信息、输出电流...
### BUF634芯片知识点详解 #### 一、概述 BUF634是一款由Burr-Brown Corporation在1993年推出的高速、大电流缓冲器。...对于需要高速信号传输和大电流驱动的应用来说,BUF634无疑是一个理想的选择。
汇编语言 在 BUF 和 BUF+1、BUF+2 单元分别放有一个有符号字节型数,编程序 将其中最小数存入 MIN 单元中。
这个过程需要工具能够理解buf文件的结构,因为buf格式没有统一的标准,通常是由特定的应用程序或库定义的。 转换完成后,生成的XML文件将保存在相同目录下,或者根据批处理脚本的设定保存在指定位置。XML文件可以被...
标题"DATAS1.rar_buf1复制到buf2"指的是一个任务,即需要将名为BUF1的数据区域的内容复制到另一个名为BUF2的区域。这个过程通常涉及到内存操作和循环机制。下面我们将深入探讨这个过程。 首先,我们需要了解汇编...
//buf.build/ 上传命令windows 专用buf.exehttps://buf.build/ 上传命令windows 专用buf.exehttps://buf.build/ 上传命令windows 专用buf.exehttps://buf.build/ 上传命令windows 专用buf.exehttps://buf.build/ ...
为了使用Protocol Buffer编译工具包,你需要先安装对应版本的protoc,然后编写.proto文件定义数据结构,最后通过命令行调用protoc生成所需的源代码。一旦完成这一步,你就可以在项目中导入生成的类,利用PB提供的API...
综上所述,这个压缩包为用户提供了跨平台、多IDE兼容的Protocol Buffer实现,特别适合需要在Windows环境下使用VS或Qt进行开发的项目。使用这个库,开发者可以轻松地在不同系统和语言间交换数据,提升应用的性能和...
从谷歌官网下载一些文件,Encoding.txt, Java Generated Code.txt,Language Guide.txt,Protocol Buffer Basics Java.txt,Style Guide.txt。
高频放大器容易受到寄生电容和分布参数的影响,因此在设计时需要特别注意布局和布线,以减少寄生效应。其次,是电源噪声和干扰的管理,这需要精心设计的电源滤波电路和良好的接地策略。 在进行原理图设计时,工程师...
设在一个缓冲区BUF1中存放了一个串“123GOOD”, 将其以相反顺序拷贝到另一个缓冲区BUF2中。 特别说明: 在实验记录中:要有用TD观察程序执行前后的数据区,并且将相应的数据区显示截图(即显示出原串的ASCII,...
FEATURES ● OPEN-LOOP BUFFER ● HIGH-SLEW RATE: 3600V/µs, 5.0Vp-p ● BANDWIDTH: 320MHz, 5.0Vp-p 900MHz, 0.2Vp-p ● LOW INPUT BIAS CURRENT: 0.7µA/1.5µA ● LOW QUIESCENT CURRENT: 3mA/6mA ● GAIN ...
Linux 数据栈中的关键数据结构 skb_buf Linux 数据栈中的关键数据结构 skb_buf 是网络代码中最重要的数据结构之一,它表示接收或发送数据包的包头信息。该结构在 `<include/linux/skbuff.h>` 中定义,并包含了许多...
Buf是Protocol Buffers(protobuf)生态中的一个工具,它是一个强大的接口定义语言(IDL)和命令行工具,用于管理、构建和验证protobuf项目。Protocol Buffers是Google开发的一种数据序列化协议,常用于构建高性能、...
其适用于各种需要高电源稳定性和可靠性的工作环境,通过内置缓冲模块的功能可以显著提升工业控制系统在面对电力波动或中断时的抗风险能力。同时,用户还可以借助西门子提供的全方位在线服务和技术支持,确保电源系统...
已知BUF1,BUF2字节单元中各存放一个无符号数,编写程序完成下述功能: 若两个数中一个是奇数一个是偶数,则奇数存入BUF1单元,偶数存入BUF2单元。 若两个数均为奇数,则分别加1后存回原单元 若两个数均为偶数,则不...
这款器件适用于那些需要精确伽马校正和大电流驱动能力的高分辨率LCD显示系统。 总的来说,TI-BUF11702是高分辨率LCD面板伽马校正的理想解决方案,它结合了高效的电容驱动、强大的VCOM功能、低功耗以及出色的ESD保护...