Protocol buffers 我应该使用二进制文件还是文本文件来存储protobuf消息?

Protocol buffers 我应该使用二进制文件还是文本文件来存储protobuf消息?,protocol-buffers,Protocol Buffers,使用Google protobuf,我将序列化的消息数据保存到一个文件中——每个文件中都有多条消息。我们既有C++的代码,也有Python版本的代码,所以我需要使用两种语言都可用的OptoBuf函数。我尝试过使用SerializeToArray和SerializeAsString,但似乎出现了以下不幸的情况: SerializeToArray:正如一个答案中所建议的,使用它的最好方法是在每条消息的前面加上它的数据大小。这对于C++来说是很有用的,但是在Python中,看起来不可能。我错了吗?

使用Google protobuf,我将序列化的消息数据保存到一个文件中——每个文件中都有多条消息。我们既有C++的代码,也有Python版本的代码,所以我需要使用两种语言都可用的OptoBuf函数。我尝试过使用SerializeToArray和SerializeAsString,但似乎出现了以下不幸的情况:

  • SerializeToArray:正如一个答案中所建议的,使用它的最好方法是在每条消息的前面加上它的数据大小。这对于C++来说是很有用的,但是在Python中,看起来不可能。我错了吗?
  • SerializeAsString:这将生成一个序列化字符串,该字符串相当于它的二进制对应项-我可以将其保存到文件中,但是如果序列化结果中的一个字符是\n会发生什么情况-我们如何找到行结尾或消息的结尾

  • 更新:
    请允许我稍作修改。据我所知,我不能在C++中编写二进制数据,因为我们的Python应用程序不能读取数据,因为它只能解析字符串序列化消息。那么,我应该在C++和Python中使用<代码> SerializeAsString < /代码>吗?如果是,那么将这些数据存储在文本文件而不是二进制文件中是否是最佳做法?我的直觉是二进制的,但正如你所看到的,这看起来不是一个选项。

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

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


    有关更多信息,请参阅protobuf文档中的。

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


    到目前为止,将这些消息作为行分隔文本保存的优点对于维护和调试来说是非常宝贵的。计算出一个文件中有多少条消息<代码>wc-l。找到第n条消息-
    标题…|尾部
    。找出需要通过2个VPN和citrix解决方案访问的远程系统上的记录有何问题?复制粘贴消息并将其邮寄给程序员。

    Protobuf是一种二进制格式,因此读写应该以二进制格式进行,而不是文本。
    如果你不想要二进制格式,你应该考虑使用除了原始BUFF之外的东西(有很多文本数据格式,比如XML、JSON、CSV);仅仅使用文本摘要是不够的。

    是否应该使用二进制文件或文本文件?原始数据总是二进制的,只是Python和C++字符串可以保存二进制数据。因此,最终使用的数据类型并不重要。