使用 Google protobuf,我将序列化消息数据保存到一个文件中 - 每个文件中都有几条消息。我们有 C++ 和 Python 版本的代码,因此我需要使用两种语言都可用的 protobuf 函数。我尝试过使用 SerializeToArray 和 SerializeAsString ,似乎存在以下不幸的情况:

  1. 序列化为数组:正如一个答案所建议的,使用它的最佳方法是在每条消息中添加其数据大小的前缀。这对于 C++ 来说非常有用,但是在 Python 中,这看起来不可能——我错了吗?

  2. 序列化为字符串:这会生成一个与其二进制对应物等效的序列化字符串 - 我可以将其保存到文件中,但是如果序列化结果中的字符之一是 会发生什么 - 我们如何找到行结尾或与此相关的消息结尾?

更新:

请允许我稍微改一下。据我了解,我无法用 C++ 编写二进制数据,因为这样我们的 Python 应用程序就无法读取数据,因为它只能解析字符串序列化消息。那么我应该使用 SerializeAsString 在 C++ 和 Python 中?如果是,那么最佳实践是将此类数据存储在文本文件而不是二进制文件中吗?我的直觉是二元的,但正如你所看到的,这看起来不像是一个选择。

有帮助吗?

解决方案

以这种方式连接消息的最佳实践是在每条消息前面添加其大小。这样你就可以读取大小(尝试使用 32 位 int 或其他值),然后将字节数读入缓冲区并反序列化。然后读取下一个尺寸等。ETC。

写作也是如此,首先写出消息的大小,然后写出消息本身。

流式传输多条消息 有关更多信息,请参阅 protobuf 文档。

其他提示

我们已经取得了巨大的成功,对消息进行 Base64 编码,并使用简单的 来分隔消息。这当然很大程度上取决于您的使用 - 我们需要将消息存储在“日志”文件中。它自然会产生编码/解码的开销 - 但这对我们来说根本不是问题。

迄今为止,将这些消息保留为行分隔文本的优点对于维护和调试来说是非常宝贵的。找出文件中有多少条消息? wc -l 。找到第 N 条消息 - head ... | tail. 。找出您需要通过 2 个 VPN 和一个 Citrix 解决方案访问的远程系统上的记录出了什么问题?复制粘贴消息并将其邮寄给程序员。

Protobuf 是一种二进制格式,因此读写应该以二进制方式进行,而不是文本。如果你不想要二进制格式,你应该考虑使用除 protobuf 之外的其他格式(有很多文本数据格式,例如 XML、JSON、CSV);仅使用文本抽象是不够的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top