[翻译] ProtoBuf 官方文档(六)- 相关技术

翻译查阅外网资料过程中遇到的比较优秀的文章和资料,一是作为技术参考以便日后查阅,二是训练英文能力。

此文翻译自 Protocol Buffers 官方文档 Techniques 部分

翻译为意译,不会照本宣科的字字对照翻译
以下为原文内容翻译

相关技术

本页将介绍一些处理 Protocol Buffers 的常用设计模式。你可以将设计和使用相关的问题发送到 Protocol Buffers 讨论组.

多消息(Message)流

如果要将多条消息(Message)写入单个文件或流,则需要跟踪一条消息的结束位置和下一条消息的开始位置。因为 Protocol Buffer 数据格式不是自定界限的,因此 Protocol Buffer 解析器无法确定消息自身的结束位置。解决此问题最简单的方法就是在每条消息本身内容之前记录消息的大小或长度。当你重新读取消息时,可读取其大小,读取对应字节到单独的缓冲区,然后从该缓存区中解析消息内容。(如果你不想将字节复制到单独的缓冲区,请查看 CodedInputStream 类(C++ 和 Java 都具有此类),这个类可以限制读入缓冲区的字节数)。

大数据集

Protocol Buffers 并不是为处理大信息(large messages)而设计的。依据一般的经验法则,如果你处理的是每个 message 都大于兆字节的数据(messages),那么这个时候可能需要考虑换一种策略。

也就是说,protocol buffers 非常适合处理大数据集中的单个消息。通常大数据集是一些小块数据的集合,而其中每个小块可能是结构化的数据。 尽管 protocol buffers 无法同时处理整个数据集,但可以使用 protocol buffers 对每一小块进行编码从而极大简化我们的问题:现在我们只需要处理一组字节字符串而不是一组结构。

Protocol Buffers 并没有内置对大数据集的支持,因为不同的情况通常需要不同的解决方案。有时一个简单的记录列表就能满足需求,而有时你需要的可能是一个更接近数据库的东西。每一个解决方案都应该作为单独的库去开发,而只有真正需要这些相应解决方案的才需要付出相应成本。

自描述信息

Protocol Buffers 并不包含其自身类型的描述。所以如果没有给出定义类型的 .proto 文件,而只有原始信息(raw message)是很难提取任何有用数据的。

译者注:
自描述信息对于反射实现至关重要

然而,值得注意的是 .proto 文件的内容本身实际上也可以使用 protocol buffers 来表达。源码中的 src/google/protobuf/descriptor.proto 定义了所需的相关类型。protoc 命令可以使用 --descriptor_set_out 选项来输出 FileDescriptorSet(此类就表示一组 .proto 文件)。通过这种方式,你可以定义一个自描述的协议消息,如下所示:

message SelfDescribingMessage {
  // Set of .proto files which define the type.
  required FileDescriptorSet proto_files = 1;

  // Name of the message type.  Must be defined by one of the files in
  // proto_files.
  required string type_name = 2;

  // The message data.
  required bytes message_data = 3;
}

通过 DynamicMessage 类(C++ 和 Java 中可用),你可以编写操作上述 SelfDescribingMessages 的工具。

简单来讲的话,这个功能之所以未包含在 Protocol Buffer 库中,是因为我们从未在 Google 内部使用过它。

此技术需要对 proto2 语法的支持(因为这是 descriptor.proto 使用的语法)以及对使用描述符的动态信息的支持。在使用自描述消息之前,请检查你需要的平台是否支持这些功能。

你可能感兴趣的:([翻译] ProtoBuf 官方文档(六)- 相关技术)