Protobuf二进制格式的设计:性能和varint

时间:2017-06-06 17:56:46

标签: protocol-buffers

我需要设计一种二进制格式来保存科学应用程序中的数据。这些数据必须以二进制格式编码,任何其他应用程序都无法轻松读取(这是我们的一些客户的要求)。因此,我们决定构建自己的二进制格式,编码器和解码器。

我们从许多二进制格式中获得了一些灵感,包括protobuf。令我困惑的一件事是protobuf编码嵌入消息长度的方式。根据{{​​3}},嵌入消息的大小在其最初编码为varint。 但在我们对嵌入式消息进行编码之前,我们还不知道它的大小(例如,考虑包含许多整数编码为varint的嵌入式消息)。因此,在将消息写入磁盘之前,我们需要完全对消息进行编码,以便我们知道它的大小。 想象一下,这个消息是巨大的。因此,很难以有效的方式对其进行编码。我们可以将这个大小编码为一个完整的int,并在写入嵌入的消息后回溯到文件的这一部分,但是我们失去了varints的优点:你不需要指定你是否有32位或64位整数。所以使用varint回到Google的实现:

是否存在我遗漏的实施技巧,或者这种方案对于大型消息可能效率低下?

1 个答案:

答案 0 :(得分:0)

是的,执行此操作的正确方法是首先在缓冲区的后面写入消息,然后添加大小。通过适当的缓冲区管理,您可以反向编写消息。

那就是说,为什么只要使用protobuf就可以编写自己的消息格式?最好直接使用Protobuf并加密文件格式。这对您来说很容易使用,而且其他应用程序仍然难以阅读。