使用Google protobuf,我将序列化的消息数据保存到文件中 - 在每个文件中都有几条消息.我们有C++和Python版本的代码,所以我需要使用两种语言都可用的protobuf函数.我已经尝试使用SerializeToArray和SerializeAsString,似乎有以下不幸的条件:
SerializeToArray:正如在一个答案中所建议的,使用它的最佳方法是为每条消息添加前缀数据大小.这对C++来说非常有用,但在Python中看起来不太可能 - 我错了吗?
SerializeAsString:这会生成一个等效于它的二进制对应的序列化字符串 - 我可以将其保存到文件中,但是如果序列化结果中的一个字符是\n - 我们如何找到行结尾或消息的结尾会发生什么?那件事?
请允许我稍微改写一下.据我所知,我无法用C++编写二进制数据,因为我们的Python应用程序无法读取数据,因为它只能解析字符串序列化的消息.那么我应该SerializeAsString在C++和Python中使用吗?如果是,那么最好将这些数据存储在文本文件而不是二进制文件中吗?我的直觉是二元的,但你可以看到这看起来不是一个选择.
以这种方式连接消息的最佳实践是在每个消息的前面加上大小.这样你读取大小(尝试32位int或其他东西),然后将该字节数读入缓冲区并反序列化它.然后阅读下一个尺寸等.等
写作也是如此,你首先要写出消息的大小,然后是消息本身.
有关详细信息,请参阅protobuf文档中的Streaming Multiple Messages.
我们已经取得了巨大的成功 base64 编码消息,并使用简单的 \n 来分隔消息。这将在很大程度上取决于您的使用 - 我们需要将消息存储在“日志”文件中。它自然有编码/解码开销 - 但这对我们来说甚至不是一个问题。
迄今为止,将这些消息保存为行分隔文本的优势对于维护和调试来说是无价的。找出文件中有多少条消息?wc -l. 找到第 N 个消息 - head ... | tail。找出需要通过 2 个 VPN 和 citrix 解决方案访问的远程系统上的记录有什么问题?复制粘贴消息并将其邮寄给程序员。
| 归档时间: |
|
| 查看次数: |
5515 次 |
| 最近记录: |