首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

搞定Protocol Buffers (下)- 原来你是这样的pb

上一篇我们熟悉了protocol buffers安装使用以及proto3的语法,本篇继续来聊聊其实现原理。 protocol buffers 主要分编译器编译部分和运行时部分。...编译期 编译器一瞥 通常使用protocol buffers都是先写好.proto文件,在用protocol buffers编译器生成目标语言所需要的源代码文件。然后将生成的代码和应用程序一起编译。...type为1,它告诉解析器期望固定的64位数据块;同样,float和fixed32的wire type为5,表明其需要使用32位的数据块。...默认情况下,在同一protocol buffers消息实例上重复调用序列化方法时,可能不会返回相同的字节输出。即默认序列化不是确定性的。 确定性序列化仅可确保特定二进制文件的字节输出相同。...,通用性较差 自解释性较差,只能通过.proto了解数据结构 关于编码,了解protocol buffers编码原理对于合理使用protocol buffers很有必要,比如我们知道int32 int64

93510
您找到你想要的搜索结果了吗?
是的
没有找到

高效的数据压缩编码方式 Protobuf

proto3 的 JSON 实现中提供了以下 4 中 options: 使用默认值发送字段:在默认情况下,默认值的字段在 proto3 JSON 输出中被忽略。...一个实现可以提供一个选项来覆盖这个行为,并使用它们的默认值输出字段。 忽略未知字段:默认情况下,Proto3 JSON 解析器应拒绝未知字段,但可能提供一个选项来忽略解析中的未知字段。...发送枚举形式的枚举值而不是字符串:在 JSON 输出中默认使用枚举值的名称。可以提供一个选项来使用枚举值的数值。...message 的二进制版本只是使用字段号(field's number 和 wire_type)作为 key。...所以 wire_type 类型为 2 的数据,编码的时候会默认转换为 T-L-V (Tag - Length - Value)的形式。 5.

4.4K11

ActiveMQ学习之通讯协议

这是因为activeMQ中默认的消息协议就是openwire 二、Transmission Control Protocol(TCP) 1、这是默认的broker配置,TCP的...Client监听的端口为61616 2、在网络传输协议之前,必须要序列化数据,消息是通过一个叫wire protocol的来序列化成字节流,...默认情况下 ActiveMQ默认wire protocol叫做openwire,目的是促使网络上的效率和数据进行快速交互 3、TCP连接的url形式如下:“tcp://hostname...因此,NIO的实现 比TCP需要更少的线程去运行,所以建议使用NIO协议 2.2、可能对于Broker有一个很迟钝的网络传输...trace=true"/> 四、Advanced Message Queuing Protocol(amqp协议) amqp协议是一个提供统一消息服务的应用层标准高级消息队列协议

96220

Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?

使用流程 关于 Protocol Buffer 的使用流程,具体请看我写的文章:快来看看Google出品的Protocol Buffer,别只会用Json和XML了 ---- 6....,即不需要编码 相应字段在解码时才会被设置为默认值 ---- 7....,Protocol Buffer根据 Tag 将 Value 对应于消息中的 字段 具体使用 // Tag 的具体表达式如下 Tag = (field_number << 3) | wire_type...使用建议 根据上面的序列化原理分析,我总结出以下Protocol Buffer的使用建议 通过下面建议能有效降低序列化后数据量的大小 建议1:多用 optional或 repeated修饰符...因为若optional 或 repeated 字段没有被设置字段值,那么该字段在序列化时的数据中是完全不存在的,即不需要进行编码 相应的字段在解码时才会被设置为默认值 建议2:字段标识号(Field_Number

6.3K61

MQ 系列之 ActiveMQ 传输协议

Transmission Control Protocol(TCP),这是默认的 Broker 配置,TCP 的 Client 监听端口61616。...在网络传输数据前,必须要序列化数据,消息是通过一个叫 wire protocol 的来序列化成字节流。...默认情况下 ActiveMQ 把 wire protocol 叫做 OpenWire,它的目的是促使网络上的效率和数据快速交互。TCP 连接的 URI 形式为 tcp://hostname:port?...1.1.2 协议对比 协议 说明 TCP【常用】 默认的协议,性能相对可以 NIO【常用】 基于 TCP 协议之上的,进行了扩展和优化,具有更好的扩展性 UDP 性能比 TCP 更好,但是不具有可靠性...要通过 NIO TCP 连接配置 ActiveMQ 自动 wire format 检测,使用 auto+nio 传输前缀。 ☞ 配置方式 ?

1.1K20

如何使用protobuf-inspector对Protocol Buffers进行逆向工程分析

关于Protocol Buffers  Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。...下面给出的是一个输出样例: 正如我们所看到的,工具会显示字段名以及一些详细数据,其中包含: 1、变量是否使用zig-zag编码(假设默认使用zig-zag编码); 2、32位/64位值是整数还是浮点...(默认情况下都显示); 3、签名(默认情况下自动检测); protobuf-inspector能够在大多数情况下正确解析数据结构,当它在字段上找到嵌入的二进制数据时,它将首先尝试将其解析为消息。...它按照字段在wire格式中的编码顺序显示字段,因此除了逆向工程之外,对于那些希望熟悉wire格式或解析器开发人员的人来说,它也很有用。  ...,我们也可以使用pip来安装protobuf-inspector: pip install protobuf-inspector  工具使用  工具安装完成之后,我们就可以使用下列命令通过STDIN

1.3K20

深入浅出mongodb之实战

深入浅出mongodb(一)和深入浅出mongodb(二)两篇文章讲述了一些安装和使用的基础知识,这篇文章小编将带你走进实战世界,真正体会项目中是怎么使用mongodb开发,让我们一起揭开它神秘的面纱。..., --force force on non-empty directory -h, --help output usage information 在默认的情况下...bin是启动目录,里面有一个www启动文件,默认的端口是3000,如果不合适我们可以手动修改 node_modules这个目录下面是我们安装的所有依赖 pubilc这个文件夹下是我们前端存放静态资源的...我们在执行node文件的时候,如果修改了node文件,每次执行都需要重新启动项目才行,为了方便我们可以使用nodemon来监听项目的改动,不再需要重复启动项目,这么方便的东西用起来能不香??...const mongoose = require("mongoose"); const Scheme = mongoose.Schema; const ObjectId = mongoose.Types.ObjectId

1.7K10

App自动化测试|Appium工作原理及Desired Capbilities配置

uiautomatorJsonWireProtocol:它是一种协议,遵循REST风格,以JSON方法进行传输,是一系列的键值对,遵循W3C WebDriver Spec设计风格;appium中的Json wire...protocol继承自selenium的webdriver wire protocol,并进行了扩展,使得Json wire protocol能够控制不同的移动设备的行为。...Desired Capabilities常用键值对介绍:automationName:使用哪种自动化引擎。appium(默认)还是Selendroid。...默认值为falseresetKeyboard:在设定了unicodeKeyboard关键字的Unicode测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。...默认值为false;(一般和app属性一起使用) DesiredCapabilities使用实例:定义一个Desired Capabilities配置的字典from appium import webdriver

2.5K10

gRPC & Protocol Buffers

0、gRPC gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP/2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。...没有赋值的key,不参与序列化:序列化时只会对赋值的key进行序列化,没有赋值的不参与,在反序列化的时候直接给默认值即可; 可变长度编码:主要缩减整数占用字节实现,例如java中int占用4个字节,但是大多数情况下...,我们使用的数字都比较小,使用1个字节就够了,这就是可变长度编码完成的事; TLV: TLV全称为Tag_Length_Value,其中Tag表示后面数据的类型,Length不一定有,根据Tag的值确定...低三位表示wire type,其他的位表示field number(编号)。...Protocol Buffer 是 Tag - Value (Tag - Length - Value)的编码方式的实现,减少了分隔符的使用,数据存储更加紧凑。

64220
领券