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 的 向前兼容和向后兼容特性主要体现在 ,数据结构、数据在长期不间断的使用中;需要对数据结构进行修改更新的情况下;如何兼容过去的数据以及将来的数据。