Protocol Buffers 是什么

Protocol Buffers

Proto buff 是什么?

官方概述:

Protocol Buffers 是一种语言中立、平台中立的可扩展机制,用于序列化 结构化数据。
Protocol buffers 提供了一种语言中立、平台中立、可扩展的机制,用于以向前兼容和向后兼容的方式序列化结构化数据。它类似于 JSON,只是它更小更快,并且它生成本地语言绑定。

JSON相信大家都非常熟悉;JSON是一种轻量级数据交换格式。人类可阅读和书写的。机器很容易解析和生成;JSON 是一种完全独立于语言的文本格式。

由此可以看出:这两者都是用于数据格式、语言中立、平台中立的。

那么更小更快,并且生成本地语言绑定是指的什么呢?

[
{id:1,name:123,address:XXXXXX},
{id:1,name:123,address:XXXXXX},
{id:1,name:123,address:XXXXXX},
{id:1,name:123,address:XXXXXX},
{id:1,name:123,address:XXXXXX}
]

上边这是一个常见的JSON数组对象,其中id、name、address 作为对象key出现了多次重复。也就是说一个消息体中有一半是重复的无意义信息。接下来我们将这个消息进行分解。

消息头
{id:1,name:2,address:3}
消息体
[
{1:1,2:123,3:XXXXXX},
{1:1,2:123,3:XXXXXX},
{1:1,2:123,3:XXXXXX},
{1:1,2:123,3:XXXXXX},
{1:1,2:123,3:XXXXXX}
]

现在我们将消息分解成两部分 【消息头、消息体】,其中一部分将key 替换为占用字节最小的数字以提高其紧凑性。在这样的情况下我们在任意扩展消息体的时候,依然可以保证有效信息的高占比量。但是缺点是我每次都需要携带一个消息头的模块;如果key的重复率过低;或者是对象类型的消息,那么这样做反而加重了消息的臃肿度。要解决这个问题,我们可以将【消息头】改为约定,这样每个消息就可以不用携带消息【头信息】,因为我们已经阅读好数字 1 代表ID,数字 2 代表name。由此我们使得JSON变的更小。

接下来我们如何让它变的更快?
首先数据在内存或者硬盘中都是以二进制形式存在;若要转换为普通文本字符串是需要进行编码转换。若去掉编码过程,将数据以二进制形式传递与保存;这样序列化过程是不是就更快了。

本地语(当前)言绑定
JSON的语言中立是在与 语言零耦合的情况下对普通字符串进行格式解析;需要额外对数据与当前语言对象做绑定操作;那么我们能不能在确定指定JSON字符串格式的时候就生成对应结构的语言对象;从而减少当前语言绑定操作呢。若按照这个思路进行,那么json的使用流程将变为如下方式:
1、设计json字符串格式
2、生成语言对应的数据对象
3、使用语言对象构建数据
4、序列化对象生成json字符串
5、使用语言对象导入json字符串
6、使用对象

由上步骤可以看出,在确定json数据结构之后,就需要生成本地语言对象。在使用的时候是直接 使用的本地语言对象;中间是不要做额外的数据到本地语言对象的绑定操作。

经过以上设想,我们可以确定: Proto buff跟JSON一样是用于序列化 结构化数据;并且 Proto buff 是以二进制形式进行传递与保存,数据字段key以约定数字进行代替;其次对Proto buff 二进制数据的解析需要特定对象(与语言无关,不同语言各自生成自己的对象)。

总结
本文主要在JSON的基础上扩展出Proto buff;也解释了两者的差异;其中Proto buff 的 向前兼容和向后兼容特性主要体现在 ,数据结构、数据在长期不间断的使用中;需要对数据结构进行修改更新的情况下;如何兼容过去的数据以及将来的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值